NASM:远端呼叫,段和偏移量存储在寄存器中

时间:2018-09-27 23:35:06

标签: assembly x86 nasm

我已经将代码段和偏移值存储在两个寄存器中,分别说AXBX。在NASM中,如何编码对AX:BX的远端呼叫?我尝试了call AX:BX,但收到了错误invalid combination of opcode and operands。该指令如何编码?

3 个答案:

答案 0 :(得分:2)

在段和/或偏移量在寄存器中的情况下,无法对远距离调用指令进行编码。远端调用指令要求将目的地指定为既提供目的地的段和偏移量的立即操作数,又提供提供该地址的内存操作数。因此,仅以下示例的示例有效:

    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的返回堆栈缓冲区生成不正确的分支预测。

答案 1 :(得分:1)

这是一种方法:

push ax
push bx
retf

答案 2 :(得分:1)

您必须将它们存储在内存中。您无法通过寄存器进行远方通话。假设将bp设置为帧指针,则可以使用以下内容:

push ax
push bx
call far [bp-N]
add sp, 4

(具有适合N的值)。