在长模式下使用近乎调用的地址大小覆盖

时间:2017-05-09 20:01:53

标签: assembly x86-64

英特尔手册(第2卷第2.2.1.6段)说:

  

使用address-size前缀不会禁用RIP相对   寻址。地址大小前缀的作用是截断和   将计算出的有效地址零扩展为32位。

CALL rel32说明:

  

相对于下一条指令调用near,relative,displacement。 32位   位移符号在64位模式下扩展到64位

因此,rel32是立即而不是地址,因为操作数大小前缀会覆盖默认值。

但是如果使用near call(或jmp)的地址大小覆盖前缀,它会如上所述对有效地址进行零扩展,还是不会产生任何影响?

1 个答案:

答案 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参与。