希望对x86call
指令有更好的解释。我有点理解调用近和调用远。但我不完全理解细分市场。深入了解我的主要问题,我正在查看 IDA 中的二进制文件,其起始代码是:
push 0xdeadbeef
call near 0xdeadbeef
希望对x86call
指令有更好的解释。我有点理解调用近和调用远。但我不完全理解细分市场。深入了解我的主要问题,我正在查看 IDA 中的二进制文件,其起始代码是:
push 0xdeadbeef
call near 0xdeadbeef
您在现代二进制文件中遇到的 99% 的调用都是near
.
near
(with opcode E8
) 是相对于当前地址的调用,并且只影响?IP
. 因此,它将操作数(字或双字)添加到下一条指令指针。它将操作数添加到?IP
far
(with opcode 9A
) 跳转到一个绝对段和 offset。即,这就像设置 CS
和?IP
一次。内存实际上是按段组织的。在现代操作系统中,您通常不会弄乱段(CS
在用户模式和内核模式下具有固定值),因此您不会出于任何原因更改它们。
段是进入一段内存的“窗口”。您可以将全部或部分内存映射到单个段中,多个段可以具有相同内存的重叠视图。远程调用或跳转允许您在这些窗口之间或之内移动。近距离呼叫或跳跃允许您仅在当前窗口内移动。
调用和跳转的唯一区别是调用将返回地址保存在堆栈上。对于远调用,返回选择器也保存在堆栈中。
但是,您的问题缺乏关于您到底想知道什么的足够详细信息。