代码之家  ›  专栏  ›  技术社区  ›  G S

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

  •  0
  • G S  · 技术社区  · 7 年前

    AX BX 分别。在NASM中,如何对远程调用进行编码 AX:BX ? 我试过了 call AX:BX invalid combination of opcode and operands . 如何对该指令进行编码?

    3 回复  |  直到 6 年前
        1
  •  3
  •   Ross Ridge    7 年前

    如果段和/或偏移量在寄存器中,则没有编码远调用指令的方法。far call指令要求目标要么作为提供目标段和偏移量的立即数操作数,要么作为提供目标段和偏移量的内存操作数。因此,下面的示例说明是有效的:

        call 0x1234:0x5678   ; immediate operand
        call FAR far_func    ; immediate operand
        call FAR [far_fnptr] ; memory operand
        call FAR [bp - 8]    ; memory operand
    

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

        2
  •  1
  •   500 - Internal Server Error    7 年前

    有一种方法:

    push ax
    push bx
    retf
    
        3
  •  1
  •   prl    7 年前

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

    (N的适当值)。

    推荐文章