【发布时间】:2019-06-26 00:56:01
【问题描述】:
我正在编译和运行二进制文件(引导扇区,第 1 阶段,第 2 阶段)以进行练习。引导扇区是 asm,第一阶段是运行良好的 asm。第二阶段在 0x1000 加载,我有一些 asm 跳转到我的 C 代码的开头。我的跳转和调用似乎关闭(短)了两个字节。
我已经尝试过 Bochs 和 Qemu 中的代码(单步执行)。所有代码看起来都不错。我什至在 IDA 中对它进行了拆卸,每个看起来都不错。我想这可能是我缺乏代码对齐知识。
第二阶段从0x1000开始:
0x1000: cli
0x1001: xor eax,eax
0x1003: mov eax,0x1f1a
0x1008: mov esp,eax
0x100a: sti
0x100b: jmp 0x1010
第一次跳转位于 0x1010(这是反汇编的 C 代码):
0x1010: push 0x16b4
0x1015: call 0x14ca <---
0x101a: add esp,0x4
0x101d: jmp 0x101d
上面对 0x14CA 的调用实际上落在了 0x000014c9,短了两个字节。
在上面的代码中,我希望跳转或调用到达操作数地址,但它总是错过两个字节。
【问题讨论】:
-
0x1010 处的代码如何与 0x14CA 处的代码结合?都是C代码吗?
-
除非您向我们展示您的所有代码以及如何构建内核和不同阶段以及如何将它们组合在一起,否则这将很难提供帮助。你有github项目吗?
-
它们现在只是我计算机上的文件,我正在使用 Open Watcom v2 进行编译,所以用 wlink 链接。
-
@MichaelGreene 请发布您的完整源代码和您键入链接的确切命令。
标签: assembly x86 x86-16 osdev watcom