在长模式近通话

问题描述:

英特尔手册(第2卷第2.2.1.6)地址大小覆盖说:在长模式近通话

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

CALL rel32介绍说:

呼叫附近,相对的,相对于下一条指令位移。 32位 位移符号扩展到64位在64位模式下

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

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

这不是67-前缀可能指向的RIP相对寻址的类型,67-前缀对call/jmp/jcc偏移没有影响(相反,它是影响的66-前缀,例如,call rel16 vs call rel32)。

类型的RIP相对寻址面值约2.2.1.6会谈是何许由一个外形类似00 ModRM字节编码的事*** 101,例如像

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相对寻址仍然是活动的,但截断。如果寻址完全恢复到它在32位模式下的状态,则像00 *** 101这样的ModRM将编码[sword],而根本没有eip参与。