可以CALLF(远程调用)在英特尔64架构的64位地址存储器操作数?

问题描述 投票:2回答:1

在英特尔32位架构,我可以与使用MODR / M字节的32位地址的位置的呼叫。据英特尔手册,我需要有/ 2(010B),用于码扩展,00B为国防部和101B让我有32位位移。

如果我想在64位架构的远调用,这样我将有空间为64个地址,我知道我能/ 3(011B)的操作码扩展。然而,仍然是32位位移仅提供。是否有指定目标的64位地址的方法吗?

主要是,我想知道我怎么能有发出了呼叫位置的64位地址。

assembly 64bit x86-64 intel
1个回答
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]可编码是用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]
© www.soinside.com 2019 - 2024. All rights reserved.