【问题标题】:Is there any way to make a far jump in i386 protected mode using registers?有什么方法可以使用寄存器在 i386 保护模式下实现飞跃?
【发布时间】:2020-11-04 16:53:19
【问题描述】:
CODE_SEGMENT equ 0x8
jmp CODE_SEGMENT:label1

在 CS 寄存器中加载 CODE_SEGMENT 后,跳转到 label1。我想要达到类似的目标

mov ax, CODE_SEGMENT
jmp ax:label1

如何做到这一点?

【问题讨论】:

    标签: assembly x86 nasm osdev i386


    【解决方案1】:

    正如NASM far jump / far call in real mode and ASM code conventions 中提到的,您可以通过使用堆栈来实现:

    push eax    ; CODE_SEGMENT
    push label1
    retf
    

    这也应该在保护模式下工作,除非它是一个任务切换(请参阅 jmpretf 指令文档)

    【讨论】:

    • 你的意思是push eax,我想;重点是使用寄存器中的段选择器。 (是的,在 32 位模式下retf 会弹出 dword,丢弃高 dword 的高 16 位。felixcloutier.com/x86/ret
    猜你喜欢
    • 1970-01-01
    • 2013-11-22
    • 2016-11-05
    • 1970-01-01
    • 2011-10-18
    • 2012-03-25
    • 2016-09-30
    • 1970-01-01
    相关资源
    最近更新 更多