【问题标题】:X86: protected mode, GDT, IDTX86:保护模式、GDT、IDT
【发布时间】:2012-01-16 16:51:41
【问题描述】:

我尝试使用 kolibri 引导加载程序执行简单的内核。 它被加载到 1000:0000 中。 我不明白,这部分有什么问题:

...
; switch to PM
mov eax, cr0
or  al, 1
mov cr0, eax

use32
PROTECTED_ENTRY:
mov  ax, 00010000b  ; DATA
mov  ds, ax
mov  ss, ax
mov  esp, 0xFFFF

jmp $

mov  ax, 00011000b  ; VIDEO
mov  es, ax
mov  edi, 0

mov  esi, string
int 1

jmp $

'因为在调试器中它看起来像这样

这里发生了什么?为什么 ES 和 DS 没有改变?

附:我试图让这个内核与kolibri loader一起工作: http://wasm.ru/article.php?article=ia32int

【问题讨论】:

    标签: assembly x86 fasm bochs


    【解决方案1】:

    当您在cr0 中设置保护位时,处理器不会自动进入保护模式。之后更改cs 时进入保护模式。最简单的方法是在写入cr0 后立即插入一个远跳转。

    mov cr0, eax
    .db 066h
    jmp CODE_SEGMENT:PROTECTED_ENTRY
    
    use32
    PROTECTED_ENTRY:
    

    希望我是对的。 (我习惯于 AT&T 语法。).db 是一个操作数大小覆盖,允许 32 位地址。

    【讨论】:

      【解决方案2】:

      Tee 调试器确实将 32 位代码(您告诉汇编器使用 use32 伪操作生成 32 位代码)反汇编为 16 位代码。所以指令mov ax, 10h 被解释为mov eax, d88e0010h,其中d88e 部分实际上是下一条指令的操作码mov ds,ax

      mov esp, 0xffff 类似,被解释为mov sp, 0xffff,另外两个零字节显示为虚假的add byte ptr... 指令。

      处理器实际执行的内容取决于它的当前状态——它是处于保护模式、实模式还是平面模式等。查看状态寄存器以找出答案。可能您可以告诉调试器以不同的方式解释代码。

      【讨论】:

        猜你喜欢
        • 2016-02-04
        • 2012-02-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-06
        • 1970-01-01
        • 2015-04-28
        相关资源
        最近更新 更多