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

时间:2015-08-06 10:20:38

标签: assembly x86-64 memory-address

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

仍然,

  

3.7.5指定偏移量

     

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

     

•置换 - 8位,16位或32位值。

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

所以......

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

3 个答案:

答案 0 :(得分:3)

只有往返累加器的移动才有64位绝对地址变量 所有其他移动限制到32位位移方法。

答案 1 :(得分:3)

请注意mov absolute_addr64, %rax rax为目标。
任何注册都可以使用mov $imm64, %reg 请参阅Load from a 64-bit address into other register than rax

当AMD设计AMD64架构时,他们基本上说2GB的代码对每个人都应该足够了。

http://www.x86-64.org/documentation/abi.pdf描述了小型,中型和大型代码模型。

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

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

      

    此模型要求编译器使用movabs指令   访问大型静态数据并将地址加载到寄存器中,但是   保持小代码模型的优点,以便进行操作   小数据和文本部分中的地址(特别需要   分支)

         

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

  • 大:

      

    编译器需要使用movabs指令,如   中型代码模型,甚至用于处理文本内的地址   部分。另外,分支时需要间接分支   到当前指令指针的偏移量的地址   未知的。

         

    可以避免对文本的限制   通过分解程序中小型号的部分   进入多个共享库,所以这个模型是严格的   如果单个函数的文本变得大于   中型号允许。

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

大PIC需要用于解决全局偏移表和过程链接表。

答案 2 :(得分:1)

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

原因很简单:这些提供的编程“轻松”并不经常发生。从统计数据来看,您需要的大部分补偿都非常小。当您需要64位偏移(非常罕见)时,您始终可以使用ADD指令进行仿真,几乎不会降低性能。做64位偏移的晶体管最好用于其他事情。