我一直在关注创建操作系统的指南,就像练习一样,直到我到达试图从磁盘读取更多数据而不仅仅是引导扇区的部分之前它一直很好。当我启动操作系统时,我看到没有输出,只有闪烁的无限循环光标(AND NO ERROR MESSAGES),它应显示“Booting”后跟两个Hex号。我正在使用QEmu,并运行此命令:
qemu-system-x86_64 -drive format=raw,file=D:\booter.bin
这是我的代码:
mov ah , 0x0e
[ org 0x7c00 ]
mov si, WELCOME_STRING
call print_string
mov [ BOOT_DRIVE ], dl
mov bp , 0x8000
mov sp , bp
mov bx , 0x9000
mov dh , 5
mov dl , [ BOOT_DRIVE ]
call disk_load
mov dx , [0x9000]
call print_hex
mov dx , [0x9000 + 512]
call print_hex
print_string:
pusha
xor bx,bx
call Next
popa
ret
Next:
mov al, byte [si + bx]
int 0x10
inc bx
or al,al
jnz Next
ret
%include "D:\KOS\disk-load.asm"
%include "D:\KOS\print-hex.asm"
WELCOME_STRING:
db "Booting",0
HEX_OUT : db '0x0000' , 0
BOOT_DRIVE : db 0
jmp $
times 510 -( $ - $$ ) db 0
dw 0xaa55
times 256 dw 0xdada
times 2000 dw 0xface
这是disk-load.asm:
disk_load :
push dx
mov ah , 0x02
mov al , 0x03
mov ch , 0x00
mov dh , 0x00
mov cl , 0x02
mov bx, 0x00
mov es, bx
mov bx, 0x7c00 + 512
int 0x13
jc disk_error
cmp dh , al
jne disk_error
pop dx
ret
; int 0x13
; jc disk_error
; pop dx
; cmp dh , al
; jne disk_error
; ret
disk_error :
mov si , DISK_ERROR_MSG
call print_string
; Variables
DISK_ERROR_MSG db 'Disk read error!' , 0
最后,print-hex.asm,即使删除了对print_hex
的调用,问题仍然存在,所以问题可能不在这里:
print_hex:
pusha
mov si, HEX_OUT + 2
next_character:
mov bx, dx
and bx, 0xf000
shr bx, 4
add bh, 0x30
cmp bh, 0x39
jg add_7
add_character_hex:
mov al, bh
mov [si], bh
inc si
shl dx, 4
or dx, dx
jnz next_character
mov si, HEX_OUT
call print_string
popa
ret
add_7:
add bh, 0x7
jmp add_character_hex
我已经梳理了多个似乎有相同问题的答案,但不幸的是,没有一个有效,所以我用我自己的代码提出另一个问题。为什么磁盘加载不正确,我该如何解决?
提前致谢
NB 我在Windows上,因此我删除了QEmu的一些功能