你问的是不是call far [64_bit_absolute]
是可编码的吗?要获取m16:64
来自 64 位绝对地址的 80 位操作数?
No, call far [mem] https://www.felixcloutier.com/x86/CALL.html并不特殊,ModRM 只能做[disp32]
or [RIP+rel32]
,或涉及寄存器的寻址模式。 引用内存位置的内容。 (x86 寻址模式) https://stackoverflow.com/questions/34058101/referencing-the-contents-of-a-memory-location-x86-addressing-modes
Only mov al/ax/eax/rax, [abs64]
可使用 64 位绝对地址进行编码,使用特殊形式moffs
不使用 ModRM 字节的 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:offcall
获取。但它可以在堆栈上或其他地方,例如
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]