我正在尝试执行到地址 0x7C00 的绝对跳转,作为爱好 OS 中程序的一部分。我在 GAS 中使用英特尔语法并在 QEMU 中进行测试。我尝试了两种方法:
jmp 0x00007c00
和
mov eax, 0x00007C00
jmp eax
第二种方法似乎按我的预期工作并跳转到 0x7C00,但第一种方法导致 QEMU 崩溃,说明它“试图在 0x40007c00 处执行 RAM 或 ROM 之外的代码”。有谁知道为什么它会跳转到不同的地址并且高字节被设置为 0x4000?
编辑:
拆机时,我分别收到以下信息:
3c: e9 fc 7b 00 00 jmp 7c3d <int32_end+0x7ad4>
和
3c: b8 00 7c 00 00 mov $0x7c00,%eax
41: ff e0 jmp *%eax
所以他们的编译方式不同,尽管我仍然对第二个到底在做什么有点困惑,看起来像是跳转到 0x7c3d