装配启动加载程序在虚拟PC上工作,而不是在真正的PC上
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了装配启动加载程序在虚拟PC上工作,而不是在真正的PC上相关的知识,希望对你有一定的参考价值。
我的代码在虚拟机中完美运行,但在真正的PC上启动时(从USB检测到USB硬盘驱动器的USB笔驱动器)。
在virtualbox中;代码将磁盘的扇区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
答案
您可以在真实硬件上找到此代码的许多问题:
- 当您进入引导加载程序时,大多数寄存器的状态是未定义的 - 但是当您调用中断例程时,寄存器需要有效。确保在启动引导扇区时立即设置段寄存器。例如,如果ES!= CS,您跳到第二阶段将落在错误的位置。
- 在调用中断例程之前,确保您有一个有效的堆栈。
- 不要依赖可用的中断例程。许多硬件供应商认识到构建他们的硬件适用于Windows和Linux(因为这是他们99.999%的客户想要的),并且不打算实现他们知道Windows和Linux不会调用的中断例程。
- 在进行磁盘访问之前,请尝试执行更简单的操作,例如将字符串打印到视频显示中。接下来,编写一种将寄存器打印到屏幕的方法。只有这样,您才能开始以可调试的方式编写引导加载程序。
以上是关于装配启动加载程序在虚拟PC上工作,而不是在真正的PC上的主要内容,如果未能解决你的问题,请参考以下文章
ios MapKit 在启动时可见注释描述,而不是在点击时可见