【问题标题】:Virtual vs. Physical Computer虚拟与物理计算机
【发布时间】:2013-11-10 01:22:23
【问题描述】:

我正在用汇编语言编写一个小 Lambda 演算程序。我用 VirtualBox 运行它,它运行良好,但是当我将代码复制到我的 USB 驱动器的引导扇区并从中启动我的计算机时,它不起作用。

我已将问题隔离在初始加载包含函数库的额外扇区中。这是有问题的代码sn-p:

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)。任何人对这里可能出现的问题有任何建议。

【问题讨论】:

  • 不知道,但是当你开始工作时请写一篇关于这个的博客文章!
  • 可能你的U盘认为是0号驱动,而不是80h驱动?
  • BIOS 应该为您将引导驱动器号加载到DL 寄存器中,因此使用它应该可以消除该问题。
  • 我希望它这么简单,但我已经尝试过不将 DX 设置为特定值(因为 BIOS 将 DL 设置为它刚刚启动的驱动器号)但这也不起作用.为了节省起见,我将驱动器号设置为 0,但它只是卡在“JC 加载”循环中。
  • 你也得到了一个错误码,你看过了吗?

标签: assembly x86 virtualbox boot


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-06
    • 2013-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多