CALLF (Far Call) 可以在 Intel 64 架构中有 64 位地址内存操作数吗?
Can CALLF (Far Call) has a 64 bit address memory operand in Intel 64 architecture?
在 Intel 32 位架构中,我可以使用 ModR/M 字节调用 32 位地址位置。根据英特尔手册,我需要 /2 (010B) 用于操作码扩展,00B 用于 Mod 和 101B 允许我有 32 位位移。
如果我想在 64 位体系结构中进行远程调用,以便为 64 位地址留出空间,我知道我可以 /3 (011B) 进行操作码扩展。但是,仍然只提供 32 位位移。有没有办法将目标指定为 64 位地址?
主要是,我想知道如何在给定该位置的 64 位地址的情况下进行调用。
你是问 call far [64_bit_absolute]
是否可编码?要从 64 位绝对地址获取 m16:64
80 位操作数?
没有,call far [mem]
isn't special, and ModRM can only do [disp32]
or [RIP+rel32]
, or addressing modes involving registers.
只有 mov al/ax/eax/rax, [abs64]
可以用 64 位绝对地址编码,使用不使用 ModRM 字节的特殊形式的 moffs
MOV。这对你没用:在寄存器中有段或偏移量对你没有帮助。
但是您可以使用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]
在 Intel 32 位架构中,我可以使用 ModR/M 字节调用 32 位地址位置。根据英特尔手册,我需要 /2 (010B) 用于操作码扩展,00B 用于 Mod 和 101B 允许我有 32 位位移。
如果我想在 64 位体系结构中进行远程调用,以便为 64 位地址留出空间,我知道我可以 /3 (011B) 进行操作码扩展。但是,仍然只提供 32 位位移。有没有办法将目标指定为 64 位地址?
主要是,我想知道如何在给定该位置的 64 位地址的情况下进行调用。
你是问 call far [64_bit_absolute]
是否可编码?要从 64 位绝对地址获取 m16:64
80 位操作数?
没有,call far [mem]
isn't special, and ModRM can only do [disp32]
or [RIP+rel32]
, or addressing modes involving registers.
只有 mov al/ax/eax/rax, [abs64]
可以用 64 位绝对地址编码,使用不使用 ModRM 字节的特殊形式的 moffs
MOV。这对你没用:在寄存器中有段或偏移量对你没有帮助。
但是您可以使用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]