据说,这是正确的(检查int 13h / AH = 2 here的使用情况) 并且引导加载程序不是由我创建的,但是我多次读取代码并尝试使用不同的寄存器值运行它,以期可能是我的目标是错误的驱动器或类似的东西,但无济于事。 boot.bin和kernel.bin都正确存储在os.flp中,并在命令提示符下通过以下命令完成:
del os.flp
nasm boot.asm -f bin -o boot.bin
nasm kernel.asm -f bin -o kernel.bin
dd if=boot.bin of=os.flp bs=512 count=1
dd if=kernel.bin of=os.flp bs=512 count=1 seek=1
我正在使用VMWare Workstation 12 Player进行测试,我正在使用软盘插槽中的os.flp启动它(我测试的确实正确加载)
这是原始的bootloader.asm:
BITS 16
ORG 0x7C00
mov dl, 2h ; drive 0 = floppy 1
mov dh, 0h ; head (0=base)
mov ch, 0h ; track/cylinder
mov cl, 2h ; sector (1=bootloader)
mov bx, 1000h ; place kernel in RAM @1000h
mov es, bx ; place BX into pointer ES
mov bx, 0h ; back to zero - also RAM-pos related
ReadFloppy:
mov ah, 2h
mov al, 1h
int 13h
jc ReadFloppy ; if failed, loop
;pointers to RAM-pos
mov ax, 1000h
mov ds, ax
mov es, ax
mov fs, ax
mov gs, ax
mov ss, ax
jmp 1000h
times 510 - ($ - $$) db 0
dw 0AA55h ; magic number
这应该将kernel.bin加载到内存中并运行它,但它没有。我检查了我的kernel.asm中的错误,但似乎没有。但是,万一你需要看到它,
以下是kernel.asm:
;set prnt-regs
mov ah, 0Eh ; func nr
mov bh, 0h ; page
mov bl, 7h ; color
msg db 'Hello, world from the kernel!', 13, 10, 0
mov si, msg
call prntstr
jmp $ ;hang
prntstr:
.next_char:
mov al, [si] ; current char
or al, al
jz .exit_char ; if current char = 0, go to end
int 10h ; prntchar
inc si ; next char
jmp .next_char
.exit_char:
ret
times 512 - ($ - $$) db 0
有什么阻止它将其加载到内存中的想法?