【发布时间】:2018-06-15 21:31:42
【问题描述】:
我熟悉这种形式的内存引用:
XXX ptr [base + index * size + displacement]
其中 XXX 是某种大小(字节/字/双字/等),base 和 index 都是寄存器,size 是 2 的小幂,displacement 是有符号值。
amd64 引入了 rip-relative 寻址。据我了解,我应该能够使用rip 作为基址寄存器。但是,当我尝试使用 clang-900.0.39.2 时:
mov r8b, byte ptr [rip + rdi * 1 + Lsomething]
我明白了:
错误:无效的基数+索引表达式
mov r8b, byte ptr [rip + rdi * 1 + Lsomething]
使用rip作为基址寄存器时是不是不能使用变址寄存器?我是否必须使用lea 来计算rip + Lsomething,然后抵消掉?
【问题讨论】:
-
RIP + 置换是 RIP 相对寻址唯一允许的寻址。因此,您可以使用 lea 获取 [rip + Lsomething] 并将其放在通用寄存器中。该寄存器可用于完成其余的地址计算。没有真正的办法绕过这个限制。
-
您可以在Intel® 64 and IA-32 Architectures Software Developer’s Manual 部分2.2.1.6 RIP-Relative Addressing 中找到它
-
仅供参考,您可能想要
movzx r8d, byte ptr [ ...],除非您特别想要合并到 R8 的现有内容而不是启动新的依赖链为那个寄存器。 -
@PeterCordes,感谢您的建议。我正在编写一个玩具 Meltdown PoC,这是探针负载,因此大小或目的地无关紧要。
标签: assembly x86-64 addressing-mode