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 模拟器中执行此代码时,它显示找不到可启动设备,如何修复它?
嗯,我以前没有见过使用段的引导扇区代码,您可能需要检查生成的引导扇区的实际内容以确保它符合规则。我认为这基本上只是确保最后两个字节是正确的签名。
我提出这个问题的原因是因为我认为
$ - $$
在这里使用是错误的。它计算出当前位置与部分的开头之间的差异,而不是引导扇区的开头。
因此,对于(例如)100 字节的代码部分和紧随其后的 20 字节的数据部分,数据部分中的
510 - ($ - $$)
变为 510 - (120 - 100)
,或 490。
这意味着您将拥有:
在生成签名之前总共有 610 个字节,因此它*不会位于正确的位置,这意味着引导加载程序不会将磁盘识别为可引导磁盘。
您可能可以通过仅使用一个部分来解决它。那么表达式就变成
510 - (120 - 0)
或 290
,给出正确的 510 字节预签名: