在英特尔32位架构,我可以与使用MODR / M字节的32位地址的位置的呼叫。据英特尔手册,我需要有/ 2(010B),用于码扩展,00B为国防部和101B让我有32位位移。
如果我想在64位架构的远调用,这样我将有空间为64个地址,我知道我能/ 3(011B)的操作码扩展。然而,仍然是32位位移仅提供。是否有指定目标的64位地址的方法吗?
主要是,我想知道我怎么能有发出了呼叫位置的64位地址。
你是问,如果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]
可编码是用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相对寻址模式。
否则,也许你混淆了赛格:关闭与位置调用对象的它存储在哪里?在64位模式下,call ptr16:64
(直接远调用)不可用,所以你总是需要赛格:在内存中关闭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]