#generate 16-bit code .code16 #hint the assembler that here is the executable code located .text .globl _start; #boot code entry _start: jmp _boot start: .asciz "Start.\n\r" error: .asciz "Error.\n\r" succes: .asciz "Succes.\n\r" ffs: .asciz "F.\n\r" end: .asciz "End.\n\r" .macro mWriteString str #macro which calls a function to print a string leaw \str, %si call .writeStringIn .endm # function to print the string .writeStringIn: lodsb orb %al, %al jz .writeStringOut movb $0x0e, %ah int $0x10 jmp .writeStringIn .writeStringOut: ret _boot: mWriteString start #This goes first as to now overwrite %ah and %al. mov $0x00, %ax mov %ax, %es #Section to write into mov $0x02, %ah # Read sectors from drive mov $0x01, %al # Number of sectors to read mov $0x00, %ch # Low 8 bits of cylinder mov $0x02, %cl # First sector to read (bits 0-5), upper bits of cylinder (bits 6-7) mov $0x00, %dh # Head number mov $0x00, %dl # Drive number # mov $0x00, %es mov $0xFF, %bx #Offset into section int $0x13 # Low level disk services jnc notcarry mWriteString error jmp endcarrycheck notcarry: mWriteString succes #fallthrough endcarrycheck: mWriteString mystr mWriteString end # #move to 510th byte from the start and append boot signature . = _start + 510 .byte 0x55 .byte 0xaa mystr: .asciz "asdf" . = _start + 1023 .byte 0x00