【问题标题】:Legal Far Call x86 Real ModeLegal Far Call x86 实模式
【发布时间】:2012-08-23 21:19:49
【问题描述】:

在汇编中以下列方式执行远调用是否合法:

    call farCall           ;call an example function that jumps to memory

    farCall:
    jmp 0x1111:2222        ;example address in memory

程序在 0x1111:2222 加载

    ;do some stuff
    ret                    ;return to where the call was made, NOT THE JUMP
                            TO THIS ADDRESS

请注意,这是 16 位实模式,而不是 32 位保护模式(我知道已经有问题了)

【问题讨论】:

  • 然后你会返回到错误的段(即 0x1111 而不是你调用的任何段),但可以肯定的是,去吧,汇编器不会阻止你。

标签: assembly x86 nasm


【解决方案1】:

您的代码在调用时没有将完整的远返回地址(仅偏移量,而不是 CS 段)保存在堆栈上,因此 0x1111:2222 处的子例程无法使用 retf 返回给调用者,而且很可能是普通的,也靠近ret

为什么不直接call 0x1111:2222

您还可以使用push cs+call (near)push cs+push offset 来模拟远调用指令的堆栈效果。

【讨论】:

    猜你喜欢
    • 2019-01-20
    • 2018-11-10
    • 2013-06-03
    • 2013-07-21
    • 1970-01-01
    • 2017-01-13
    • 2016-08-15
    • 1970-01-01
    • 2011-08-25
    相关资源
    最近更新 更多