assembly - NASM:在寄存器中存储段和偏移量的远调用

标签 assembly x86 nasm

我已经将代码段和偏移值存储在两个寄存器中,分别是 AXBX。在 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/

相关文章:

C - Gdb 不让我看到堆栈内存中的值

windows - Windows 8 x64 上的汇编代码

c - assembly 功率(A,b)功能

c - 从 CreateProcess 获取 PROCESS_INFORMATION

Linux x86 NASM - 子例程 : Print a dword from EAX

c - -masm 中的第一个 m 是什么意思?

c - 为什么 "movl $1, %edx"而不是 "movl $0, %edx"

linux - NASM x86-32 Linux,从文件描述符访问特定字节

macos - 为什么系统调用不起作用?

assembly - 我用 ndisasm 看到的函数后面的汇编指令的用途是什么?