QEmu程序集 - 无法读取磁盘

时间:2017-01-21 08:54:58

标签: assembly x86 nasm qemu

我一直在关注创建操作系统的指南,就像练习一样,直到我到达试图从磁盘读取更多数据而不仅仅是引导扇区的部分之前它一直很好。当我启动操作系统时,我看到没有输出,只有闪烁的无限循环光标(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的一些功能

0 个答案:

没有答案