我的引导加载程序无法使用此代码从虚拟机中的Floppy(.flp)文件中读取?

时间:2016-06-21 16:20:52

标签: assembly x86 nasm bare-metal

据说,这是正确的(检查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       

有什么阻止它将其加载到内存中的想法?

0 个答案:

没有答案