我正在阅读 Intel x86_64指南vol.1 以刷新内存寻址的工作原理。
仍然,
3.7.5指定偏移量
内存地址的偏移部分可以直接指定为静态值(称为位移),也可以通过由以下一个或多个组件组成的地址计算:
•置换 - 8位,16位或32位值。
我在 Agner Fog的汇编指南中读到,当与(r / e)ax寄存器一起使用时,可以进行64位绝对寻址。
所以......
是否可以将64位地址的绝对寻址用于jmp,mov和call(使用所有寄存器),或者我必须继续使用Base + displacement组合 ?
答案 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位相对位移。 (已知所有符号位于0
和2^31 - 2^24 - 1
之间。
medium:小代码,但数据部分分为两部分:常规和大部分(.ldata
,lrodata
,.lbss
)。
此模型要求编译器使用
movabs
指令 访问大型静态数据并将地址加载到寄存器中,但是 保持小代码模型的优点,以便进行操作 小数据和文本部分中的地址(特别需要 分支)默认情况下,只有大于65535字节的数据才会放在大数据部分
中
大:
编译器需要使用
movabs
指令,如 中型代码模型,甚至用于处理文本内的地址 部分。另外,分支时需要间接分支 到当前指令指针的偏移量的地址 未知的。可以避免对文本的限制 通过分解程序中小型号的部分 进入多个共享库,所以这个模型是严格的 如果单个函数的文本变得大于 中型号允许。
中等PIC需要movabs / lea / add
来生成大于32位的位移的RIP相对地址。
大PIC需要用于解决全局偏移表和过程链接表。
答案 2 :(得分:1)
我不认为x86架构有64位位移或偏移。
原因很简单:这些提供的编程“轻松”并不经常发生。从统计数据来看,您需要的大部分补偿都非常小。当您需要64位偏移(非常罕见)时,您始终可以使用ADD指令进行仿真,几乎不会降低性能。做64位偏移的晶体管最好用于其他事情。