CALLF(Far Call)是否可以在Intel 64架构中具有64位地址存储操作数?

时间:2019-02-09 20:16:11

标签: assembly 64-bit x86-64 intel

在Intel 32位体系结构中,我可以使用ModR / M字节进行具有32位地址位置的呼叫。根据英特尔手册,我需要对操作码扩展使用/ 2(010B),对00B进行Mod和101B允许我具有32位位移。

如果我想在64位体系结构中进行远距离调用,以便为64位地址留出空间,我知道我可以/ 3(011B)进行操作码扩展。但是,仍然仅提供32位位移。有什么办法可以将目标指定为64位地址?

主要,我想知道在给定位置的64位地址的情况下如何打电话。

1 个答案:

答案 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]