虚拟与物理计算机

时间:2013-08-16 14:26:28

标签: assembly x86 virtualbox boot

我正在编写一个小型的Lambda-calculus程序。我使用VirtualBox运行它并且它工作得很好,但当我将代码复制到我的USB驱动器的引导扇区并从中启动我的计算机时,它无效。

我已经将问题隔离在初始加载包含函数库的额外扇区中。以下是相关代码段:

PUSH 0x2000
POP ES           ;segment 0x2000
MOV BX, 0x0000   ;offset
MOV CX, 0x0002   ;sector 2 and track 0
MOV DX, 0x0080   ;drive 80 and head 0
load:
MOV AX, 0x0201   ;read only one sector
INT 0x13         ;read sector
JC load          ;repeat until no error
MOV BX, 0x0007
MOV AH, 0x0E
MOV AL, [ES:0x0000]
INT 0x10         ;print a '!' character to test if the process is successful (purely for debugging reasons)

所以使用VirtualBox我很高兴!为了表明加载过程是成功的,但在我的计算机上它给了我一个黑色空间(ASCII 0x00)。任何有关这里可能存在问题的建议。

1 个答案:

答案 0 :(得分:1)

我终于找到了解决问题的方法。事实证明,我的代码位于逻辑磁盘的前两个扇区中。虽然我的USB驱动器上只有一个逻辑磁盘,但我的十六进制编辑器在打开逻辑磁盘时排除了物理磁盘的第一个2048扇区。如果Windows看到了这种区别,对于CPU而言,它只是一个位数组。因此,当我将第二个扇区加载到内存中时,而不是加载第2050个扇区(就我所知的当时是第二个扇区而言)是数据的位置,它加载了非常正确的实际第二个扇区,除了一些杂散位,只有0x00s。

现在数据在正确的扇区中,它就像一个魅力。