在长模式近通话
问题描述:
英特尔手册(第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参与。