在Intel 32位体系结构中,我可以使用ModR / M字节进行具有32位地址位置的呼叫。根据英特尔手册,我需要对操作码扩展使用/ 2(010B),对00B进行Mod和101B允许我具有32位位移。
如果我想在64位体系结构中进行远距离调用,以便为64位地址留出空间,我知道我可以/ 3(011B)进行操作码扩展。但是,仍然仅提供32位位移。有什么办法可以将目标指定为64位地址?
主要,我想知道在给定位置的64位地址的情况下如何打电话。
答案 0 :(得分:3)
您是否要问call far [64_bit_absolute]
是否可编码?要从64位绝对地址中获取m16:64
80位操作数?
否,call far [mem]
并不特殊,ModRM只能执行[disp32]
或[RIP+rel32]
或涉及寄存器的寻址模式。 Referencing the contents of a memory location. (x86 addressing modes)
只有mov al/ax/eax/rax, [abs64]
可以使用不使用ModRM字节的特殊形式的moffs
MOV来编码为64位绝对地址。这对您没有用:将段或偏移量保存在寄存器中对您无济于事。
但是您可以使用mov r64, imm64
将地址放入寄存器。例如
mov rax, absolute_address ; where seg:off are stored
call far [rax]
或者如果您的静态地址是64位,但您的汇编器+链接器知道它在call
指令的范围内,则call far [rel seg_and_offset]
可以使用相对RIP的寻址方式。
否则,也许您会将seg:off呼叫目标与其存储的位置混淆了?在64位模式下,call ptr16:64
(直接远方调用)不可用,因此您始终需要内存中的seg:off才能获取call
。但是它可以在堆栈上或其他任何东西上,例如
push 0x23 ; new CS value ends up in the low 2 bytes of a qword
push rax ; new offset. It goes at a lower address because x86 is little-endian
call far [rsp]