英特尔手册(第2卷第2.2.1.6段)说:
使用address-size前缀不会禁用RIP相对 寻址。地址大小前缀的作用是截断和 将计算出的有效地址零扩展为32位。
CALL rel32
说明:
相对于下一条指令调用near,relative,displacement。 32位 位移符号在64位模式下扩展到64位
因此,rel32
是立即而不是地址,因为操作数大小前缀会覆盖默认值。
但是如果使用near call
(或jmp
)的地址大小覆盖前缀,它会如上所述对有效地址进行零扩展,还是不会产生任何影响?
答案 0 :(得分:1)
这不是67前缀可能定位的RIP相对寻址的类型,67前缀对call / jmp / jcc偏移没有影响(例如,它是66前缀影响,例如, call rel16
vs call rel32
)。
RIP相对寻址的类型2.2.1.6谈到的是由一个看起来像00 *** 101的ModRM字节编码的东西,例如
mov rax, [eip]
; or,
addr32 mov rax, [eip]
; or if your assembler doesn't let you write either of those,
db 67
mov rax, [rip]
这是他们的意思之一,其中rip-relative寻址仍处于活动状态但被截断。如果寻址完全像在32位模式下那样恢复,那么像00 *** 101这样的ModRM将编码[sword]
而根本没有eip参与。