Are you asking if call far [64_bit_absolute]
is encodable? To fetch the m16:64
80-bit operand from a 64-bit absolute address?
No, call far [mem]
isn't special, and ModRM can only do [disp32]
or [RIP+rel32]
, or addressing modes involving registers. Referencing the contents of a memory location. (x86 addressing modes)
Only mov al/ax/eax/rax, [abs64]
is encodable with a 64-bit absolute address, using a special form of moffs
MOV that doesn't use a ModRM byte. This is useless for you: having the segment or offset in a register doesn't help you.
But you can use mov r64, imm64
to put the address in a register. e.g.
mov rax, absolute_address ; where seg:off are stored
call far [rax]
Or if your static address is 64-bit, but your assembler + linker know it's in range of the call
instruction, call far [rel seg_and_offset]
can use a RIP-relative addressing mode.
Otherwise, maybe you're confusing the seg:off call target with location it's stored? In 64-bit mode, call ptr16:64
(direct far call) isn't available, so you always need the seg:off in memory for call
to fetch. But it can be on the stack or whatever, e.g.
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]