【发布时间】:2021-08-08 23:33:31
【问题描述】:
我正在和我的一个朋友一起开发一个简单的引导加载程序,并没有假装它会变成任何可用的东西。在编写了屏幕输入和输出函数之后,我们继续编写从磁盘读取扇区的函数,这就是第一个问题出现的地方。我声明在 qemu 和 bochs 上一切正常。对于物理硬件我不能说同样的话,我遇到错误 0x0001,这意味着 Invalid Command。
但是,我没有找到有关此错误的太多信息。在我看来,这可能意味着我的某个论点有误,但我在屏幕上打印了所有日志,但没有找到任何奇怪的值来证明这种行为是合理的。
我正在从闪存驱动器启动。我认为这也可能是一个问题(因为它不是真正的软盘),但如果 BIOS 可以加载引导扇区,那么加载下一个扇区也应该没有问题。
但是,这里是 read_sector 函数的代码:
read_sector:
start_f
pusha
mov (drive_number), %dl # drive number is stored from the main function into a global variable
mov $0x03, %si # try three times
1:
mov $0x0201, %ax
int $disk_int
jnc end
dec %si
jz 2f
xor %ah, %ah
int $disk_int
jmp 1b
2:
movzx %ah, %dx
call printh # print error code
end:
popa
end_f
这里是调用函数(dl = 0):
# ...
mov $0x0002, %cx
xor %dh, %dh
mov $0x7e00, %bx
call read_sector
# ...
我们可能做错了什么?
【问题讨论】:
-
代码似乎正确。
drive_number是否正确初始化并正确回读?如果引导加载程序不是太大,你能把它完全贴出来吗?或者制作一个重现问题的精简版本? -
当然,代码在github,特别是调用者在
init.s,而被调用者在diskout.s。init函数将drive_number设置为0x00 -
尝试移动
mov %dl, (drive_number)在初始化段寄存器:) -
天哪,这有道理,我试试
-
不错!如果您有时间,请考虑使用任何可能帮助面临相同问题的人的信息自行回答您自己的问题。
标签: assembly x86-16 att bios real-mode