gpt4 book ai didi

assembly - 为什么x86-64的jmpq只需要32位长度地址?

转载 作者:行者123 更新时间:2023-12-02 15:33:16 25 4
gpt4 key购买 nike

当我使用 objdump -D 来反汇编二进制文件时,jmpq 的典型代码类似于 e9 7f fe ff ff,即用于表示负偏移量。但是,x86-64的地址是64(48)位(据我所知),那么这个32位地址7f fe ff ff如何表示64位绝对地址的负偏移量?

此外,是否还有其他指令,例如 jmpjmpq,但具有 64 位地址位移?如何在 Intel 或 AMD 的手册中找到说明(我搜索了 jmpq 但没有找到)?

<小时/>

据我搜索,它似乎被称为RIP相对寻址。似乎并非所有指令都这样做。有64位相对寻址吗?如果是间接跳转的话,64位绝对地址应该在寄存器或者内存中吧?

最佳答案

正如其他人所指出的,x86-64 的“jmp 相对”指令仅限于 32 位有符号位移,用作相对于程序计数器的相对偏移量。

OP 问为什么没有 64 位偏移量的相对跳转。我不能代表英特尔的设计人员发言,但很明显,这条指令根本没有多大用处,特别是在 32 位相对 jmp 可用的情况下。唯一需要它的时候是当您的程序大小超过 2 GB 时,这样 32 位相对 jmp 就无法从其中的任何点到达所有内容。最近看到过任何 2Gb 目标文件吗?因此,此类指令的明显效用似乎很小。

大多数情况下,当程序变得非常大时,它们开始被分解为更易于管理的元素,这些元素可以以不同的速度发展。 (DLL 就是一个例子)。这些元素之间的接口(interface)是通过更神秘的方式(跳跃向量等)来完成的,以确保接口(interface)在进化时保持不变。极长的 jmp 相对可用于从应用程序到达另一个模块中的入口点,但将绝对地址加载到寄存器并执行寄存器间接调用的实际成本在实践中足够小,因此不值得优化。现代 CPU 设计的核心就是优化晶体管的放置位置,以最大限度地提高性能。

为了完整起见,x86(许多风格)也有非常短的 jmp 相对指令(8 位有符号偏移量)。在实践中,甚至很少需要 32 位 jmp 相关指令,特别是如果您有一个可以重新排列代码块的良好代码生成器。英特尔可能出于同样的原因将这些排除在外。我怀疑它们的效用足够高,足以证明晶体管的合理性。

“大文字操作数”的问题在许多架构中以有趣的方式出现。如果您检查代码中文字值的分布,您会发现小值(0,1、ascii 字符代码)占据了相当大的百分比;几乎所有其他都是内存地址。因此,您在程序中不需要“大文字值”,但您确实必须以某种方式处理内存地址。 Sparc 芯片著名的“将文字值低位加载到寄存器中”(意思是“小常量”)和不太常用的“加载文字值高位”(填充寄存器中的高位)用作第二条指令来生成大常量,以及较少使用。这可以使代码保持较小的规模,除非您需要一个大的常量;小代码意味着更高的有效指令获取率,这有助于提高性能。

关于assembly - 为什么x86-64的jmpq只需要32位长度地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26955200/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com