首页 > 解决方案 > 在 call/jmp 指令中解码立即数

问题描述

我目前正在开发一个 Intel x86 反汇编程序。

而且我更准确地尝试支持 CALLs 指令(当然还有 JMP),但是在解码它们时我遇到了一些问题。

这是我的问题,我有e8操作码,可以是callwor call。它的唯一操作数是立即值。

它看起来很容易实现,直到我尝试反汇编:call 0x12345.

这给了:

e8 41 23 01 00 call 12346 <_main+0x12346>

我不明白为什么反汇编程序将 my call 0x12345转换为call 0x12346.

此外,反汇编程序call 0x12346在以十六进制格式给出指令的同时输出e8 41 23 01 00

并且41 23 01 00 (0x12341)不等于0x12345甚至0x12346

过了一会儿,我发现0x12341+指令的大小(5字节)等于0x12346这似乎并不荒谬。

但我仍然不知道为什么它将我的原件0x12345转换为0x12346.

我可以记下这一点,每次在立即数上加一个并减去 5 个字节,但我更愿意知道背后的技术原因,而不是尝试随机解决我的问题以避免任何形式的未来误解。

标签: assemblyx86inteldisassembly

解决方案


推荐阅读