我已经将代码段和偏移值存储在两个寄存器中,分别是 AX
和 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 的返回堆栈缓冲区生成不正确的分支预测。
关于assembly - NASM:在寄存器中存储段和偏移量的远调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52546401/