【发布时间】:2015-08-04 20:47:07
【问题描述】:
我刚刚发现我们通常实际上是程序计数器相关的调用指令。然而 x86 指令使用 32 位宽的偏移量来表示相对数字。
如果我想跳 > 4GB 怎么办?
【问题讨论】:
-
根据this,您需要使用绝对 64 位地址或相对于保存 64 位偏移量的寄存器。
-
实际上这通常不是问题。我认为没有人编写过程序的可执行部分大于 2GB 的程序。无论如何,通过指针访问可能大于 2GB 的共享库 (DLL)。
-
谢谢你们俩。罗斯,你能解释一下你的意思吗?我是新手,所以对我来说,我不明白为什么无论如何都需要通过指针访问 dll。如果编译器放置一个 E8 操作码来调用这个 dll 方法怎么办?或者您是说编译器永远无法做到这一点,因为它不知道这个 dll 是否存在,因此它会通过间接调用进行调用?
-
@halivingston:我不是罗斯,但你说的完全正确:编译器不会直接调用外部模块——而是通过间接调用,导入表中的存根,它确实为目标地址使用了一个完整的 64 位指针。