我已经将代码段和偏移值存储在两个寄存器中,比如说AX
and BX
分别。在 NASM 中,我如何编码远程调用AX:BX
?我试过call AX:BX
,但我得到了错误invalid combination of opcode and operands
。我如何编码该指令?
没有办法对段和/或偏移量位于寄存器中的远调用指令进行编码。远调用指令要求目标要么作为提供目标的段和偏移量的立即操作数给出,要么作为提供目标的段和偏移量的存储器操作数给出。因此,仅像下面这样的示例指令是有效的:
call 0x1234:0x5678 ; immediate operand
call FAR far_func ; immediate operand
call FAR [far_fnptr] ; memory operand
call FAR [bp - 8] ; memory operand
因此,如果 AX 和 BX 寄存器中有目标段和偏移量,则需要将值存储在内存中的某个位置,然后才能调用寄存器指向的函数。例如,您可以执行以下操作:
push ax
push bx
mov bp, sp
call FAR [bp]
add sp, 4
过去常常使用 RETF 指令来执行此操作:
push cs
push .return_here
push ax
push bx
retf
.return_here:
然而,在现代 CPU 上,这会带来显着的性能损失,因为它将导致 CPU 的返回堆栈缓冲区生成不正确的分支预测。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)