繁体   English   中英

X86_64 - 汇编 - 为什么位移不是 64 位?

[英]X86_64 - assembly - Why displacement not 64 bits?

我正在阅读Intel x86_64 指南 vol.1以刷新内存寻址的工作方式。

仍然,

3.7.5 指定偏移

内存地址的偏移部分可以直接指定为静态值(称为位移)或通过由以下一个或多个组件组成的地址计算指定:

• 位移— 8 位、16 位或32 位值。

我在Agner Fog 的汇编指南中读到,当与 (r/e)ax 寄存器一起使用时,64 位绝对寻址是可能的。

所以..

是否可以使用带有 64 位地址的绝对寻址来 jmp、mov 和 call(使用所有寄存器),或者我是否必须继续使用 Base + 位移组合

只有进出累加器的移动具有 64 位绝对地址变量。
所有其他移动仅限于 32 位位移方法。

请注意, mov absolute_addr64, %rax适用于以rax作为目标的情况。
mov $imm64, %reg可用于任何寄存器。
请参阅从 64 位地址加载到 rax 以外的其他寄存器,以及为什么我们不能将 64 位立即数移动到内存中?

AMD在设计AMD64架构的时候,基本都说2GB的代码应该够大家用了。 (每个可执行文件和每个共享库;没有静态链接在一起的事物之间的调用通常需要通过完整的 64 位地址进行间接访问。)

https://gitlab.com/x86-psABI/x86-64-ABI描述了 x86-64 System V ABI 的小型、中型和大型代码模型(用于所有非 Windows 系统)。

  • small:每次跳转、调用和内存位移的正常 32 位相对位移。 (已知所有符号都位于02^31 - 2^24 - 1 )。

  • 中:小代码,但数据部分分为两部分:常规和大( .ldatalrodata.lbss )。

这种模型需要编译器使用movabs指令来访问大的静态数据并将地址加载到寄存器中,但保留了小代码模型的优点,用于处理小数据和文本部分的地址(分支特别需要)

默认情况下,只有大于 65535 字节的数据才会放入大数据部分

  • 大的:

编译器需要使用movabs指令,就像在中等代码模型中一样,即使是处理文本部分内的地址也是如此。 此外,当分支到与当前指令指针的偏移量未知的地址时,需要间接分支。

可以通过将程序分解成多个共享库来避免中小型模型中文本部分的限制,因此该模型仅在单个函数的文本变得大于中型模型允许的情况下才被严格要求。

中型PIC需要movabs / lea / add生成大于32位位移的RIP相对地址。

大型 PIC 也需要它来寻址全局偏移表和过程链接表。

我认为 x86 架构没有 64 位位移或偏移。

原因很简单:这些提供的“轻松”编程并不经常发生。 从统计上讲,您需要的大多数偏移量都非常小。 当您需要 64 位偏移量(很少)时,您始终可以使用 ADD 指令进行模拟,而几乎没有性能损失。 做 64 位偏移的晶体管最好花在做其他事情上。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM