#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" derpy2str: .asciz "This is from derpy2.\n\r" cookies: .word derpy2 .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 movb $0x0e, %ah movb $'X', %al int $0x10 movb $'\n', %al int $0x10 movb $'\r', %al int $0x10 lgdt gdtdesc #movb $42, %bl #NOT 'A' #movb %bl, 0x512 #This goes first as to now overwrite %ah and %al. mov $0x00, %ax #mov $0x08, %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 $0x7e00, %bx #Offset into section mov $(_start+0x200), %bx #Offset into section #mov $0x0, %bx #Offset into section int $0x13 # Low level disk services jnc notcarry #mWriteString error jmp endcarrycheck notcarry: #mWriteString succes #mov $0x7000, %ax #movb (%ax), %bl #movb %bl, ffs #movb 0x7000, %bl #movb %bl, ffs #mWriteString ffs #fallthrough endcarrycheck: #mWriteString mystr-block2_offset #mWriteString 0x513 #mWriteString mystr #ljmp $0x0, $derpy #.byte 0, 0, 0, 0, 0, 0, 0, 0 #ljmp $0x00, $0x7e00 #ljmp $0x00, $derpy2 ljmp $0x00, $code # movw $derpy, %ax # # cmp $0x7e00, %ax # je equal # mWriteString error # jmp after # # equal: # mWriteString succes # # after: /* movb $0x0e, %ah movw $derpy, %cx movb 0x0e, %ah movb $'I', %al int $0x10 movb 0x0e, %ah movb $'J', %al int $0x10 */ #movw $0x7E00, %cx movw $derpy2, %cx movb $0x0e, %ah #movb $'Y', %al movb %ch, %al #movb $'H', %al #movb $0x7E, %al int $0x10 movb $0x0e, %ah #movb $'Z', %al movb %cl, %al #add $0x7E, %al #sub $0x50, %al #movb $0x3C, %al int $0x10 movb $0x0e, %ah movb $'\n', %al int $0x10 movb $0x0e, %ah movb $'\r', %al int $0x10 #mWriteString mystr #jmp derpy derpyret: mWriteString end #jmp 0x7008 #endend: #mWriteString end cli hlt # derpy: mWriteString ffs ljmp $0x00, $derpyret #jmp derpyret .p2align 2 /* force 4-byte alignment */ gdt: .word 0, 0 .byte 0, 0, 0, 0 /* code segment */ .word 0xFFFF, 0 .byte 0, 0x9A, 0xCF, 0 /* data segment */ .word 0xFFFF, 0 .byte 0, 0x92, 0xCF, 0 /* 16 bit real mode CS */ .word 0xFFFF, 0 .byte 0, 0x9E, 0, 0 /* 16 bit real mode DS */ .word 0xFFFF, 0 .byte 0, 0x92, 0, 0 /* this is the GDT descriptor */ gdtdesc: .word 0x27 /* limit */ .long gdt /* addr */ #move to 510th byte from the start and append boot signature . = _start + 510 .byte 0x55 .byte 0xaa #block2_offset: .byte 'A' #Byte 513 #mystr: .asciz "asdf\n\r" #derpderp: # mwriteString 0x7001 # jmp endend derpy2: mWriteString derpy2str ljmp $0x00, $derpyret code: mWriteString derpy2str movb $0x0e, %ah movb $'C', %al int $0x10 movb $0x0e, %ah movb $'\n', %al int $0x10 movb $0x0e, %ah movb $'\r', %al int $0x10 ljmp $0x00, $derpyret . = _start + 1021 .byte 0x00 .word derpy2