gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 17:04:13 30 4
gpt4 key购买 nike

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

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com