gpt4 book ai didi

程序集引导加载程序在虚拟 PC 上运行,而不是在真实 PC 上运行

转载 作者:行者123 更新时间:2023-12-03 06:30:47 31 4
gpt4 key购买 nike

我的代码在 virtualbox 中完美运行,但在真实 PC 上启动时却无法运行(从 BIOS 检测为 USB 硬盘驱动器的 USB 笔驱动器)。

在虚拟框中;该代码将磁盘的第 2 和第 3 扇区读取到内存,打印前 128 个字节(作为调试步骤),然后执行存储在这些扇区中的代码。

在我的真实 PC 上,它成功地将正确的字节打印到屏幕上(显然正在正确读取磁盘,并将其写入内存中的预期位置),但随后会在该点停止执行而不是跳转。

为什么会有所不同,我可能做错了什么?

ORG 0x7C00;

; Load Sector 2&3 from disk to 0x1000

mov bx , 0x1000
mov ah , 0x02
mov al , 0x02
mov ch , 0x00
mov dh , 0x00
mov cl , 0x02
int 0x13;


;Print 0x1000 + 128 bytes

mov ah, 0x0e
mov bx ,0x1000;
loop2:

mov al, [bx]
cmp bx, 0x1000+128

je end2
int 0x10
add bx , 1;
jmp loop2;

end2:

; Run our code


call 0x1000

jmp $;

TIMES 510 - ($ - $$) DB 0
DW 0xAA55

最佳答案

您可能会在实际硬件上发现此代码存在很多问题:

  1. 当您进入引导加载程序时,大多数寄存器的状态是未定义的 - 但当您调用中断例程时,寄存器需要有效。确保在启动引导扇区时立即设置段寄存器。例如,如果 ES != CS,那么您跳到第二阶段的位置将会错误。

  2. 在调用中断例程之前确保您有一个有效的堆栈。

  3. 不要依赖可用的中断例程。许多硬件供应商认识到他们的硬件适用于 Windows 和 Linux(因为这是 99.999% 的客户想要的),并且不会费心实现他们知道 Windows 和 Linux 不会调用的中断例程。

  4. 在进行磁盘访问之前,尝试做一些更简单的事情,例如将字符串打印到视频显示器上。接下来,编写一种将寄存器打印到屏幕上的方法。只有这样,您才能开始以可调试的方式编写引导加载程序。

关于程序集引导加载程序在虚拟 PC 上运行,而不是在真实 PC 上运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15618322/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com