我无法在 qemu 模拟器中执行我的引导加载程序文件

问题描述 投票:0回答:1
org 0x7c00 

section .text
    mov ah, 0x0e  
    mov si, message  

print_loop:
    lodsb            
    or al, al        
    jz done          
    int 0x10        
    jmp print_loop   

done:
    hlt             

section .data
    message db "Hello, World!", 0 

times 510-($-$$) db 0   
dw 0xaa55 

当我在 qemu 模拟器中执行此代码时,它显示找不到可启动设备,如何修复它?

assembly qemu bootloader
1个回答
0
投票

嗯,我以前没有见过使用段的引导扇区代码,您可能需要检查生成的引导扇区的实际内容以确保它符合规则。我认为这基本上只是确保最后两个字节是正确的签名。

我提出这个问题的原因是因为我认为

$ - $$
在这里使用是错误的。它计算出当前位置与部分的开头之间的差异,而不是引导扇区的开头。

因此,对于(例如)100 字节的代码部分和紧随其后的 20 字节的数据部分,数据部分中的

510 - ($ - $$)
变为
510 - (120 - 100)
,或 490。

这意味着您将拥有:

  • 100 字节代码。
  • 20 字节数据。
  • 490 字节的填充。

在生成签名之前总共有 610 个字节,因此它*不会位于正确的位置,这意味着引导加载程序不会将磁盘识别为可引导磁盘。

您可能可以通过仅使用一个部分来解决它。那么表达式就变成

510 - (120 - 0)
290
,给出正确的 510 字节预签名:

  • 100 字节代码。
  • 20 字节数据。
  • 290 字节的填充。
© www.soinside.com 2019 - 2024. All rights reserved.