当前位置: 代码迷 >> 汇编语言 >> 请问,从保护模式返回到DOS的代码的有关问题
  详细解决方案

请问,从保护模式返回到DOS的代码的有关问题

热度:4676   发布时间:2013-02-26 00:00:00.0
请教,从保护模式返回到DOS的代码的问题。
这个汇编使用的是NASM汇编。这个主要的功能是实现先是进入到保护模式然后再退出程序。返回到DOS下。
但是一运行过后就会无限循环。没反应了。搞了很久都没有办法解决。。抓狂了。请教各位了。
PS:这个是《一个操作系统的实现》里面的代码。只不过我把多余的代码给去掉了。只留下进入保护模式过后再返回到DOS下的代码。可是不管怎么改。运行都是无限循环。

Assembly code
%include    "pm.inc"org  0100hjmp  LABEL_BEGIN[SECTION .gdt]LABEL_GDT:              Descriptor        0,             0,      0      LABEL_DESC_NORMAL:      Descriptor        0,        0ffffh,      DA_DRWLABEL_DESC_CODE16:      Descriptor        0,        0ffffh,      DA_CLABEL_DESC_AA:          Descriptor        0,   SegAALen -1,      DA_CGdtLen equ  $ - LABEL_GDT    GdtPtr dw   GdtLen - 1           dd 0SelectorNormal    equ LABEL_DESC_NORMAL - LABEL_GDTSelectorCode16    equ LABEL_DESC_CODE16 - LABEL_GDTSelectorAA    equ LABEL_DESC_AA     - LABEL_GDT[SECTION .s16][BITS    16]LABEL_BEGIN:    mov    ax, cs    mov    ds, ax    mov    es, ax    mov    ss, ax    mov    sp, 0100h    xor     eax,eax    mov     ax,cs    shl     eax,4    add    eax, LABEL_SEG_CODE16    mov    word [LABEL_DESC_CODE16 + 2], ax    shr    eax, 16    mov    byte [LABEL_DESC_CODE16 + 4], al    mov    byte [LABEL_DESC_CODE16 + 7], ah    xor     eax,eax    mov     ax,cs    shl     eax,4    add    eax, LABEL_REAL_ENTRY    mov    word [LABEL_DESC_AA + 2], ax    shr    eax, 16    mov    byte [LABEL_DESC_AA + 4], al    mov    byte [LABEL_DESC_AA + 7], ah    xor    eax, eax    mov    ax, ds    shl    eax, 4    add    eax, LABEL_GDT            mov    dword [GdtPtr + 2], eax    lgdt    [GdtPtr]    cli    in    al, 92h    or    al, 00000010b    out    92h, al    mov    eax, cr0    or    eax, 1    mov    cr0, eax    jmp dword SelectorCode16:0    [SECTION .aa][BITS 16]LABEL_REAL_ENTRY:        mov    ax, cs    mov    ds, ax    mov    es, ax    mov    ss, ax    in    al, 92h            and    al, 11111101b        out    92h, al            sti            mov    ax, 4c00h        int    21h        SegAALen equ $ - LABEL_REAL_ENTRY[SECTION .s16code][BITS    16]LABEL_SEG_CODE16:    mov    ax, SelectorNormal    mov    ds, ax    mov    es, ax    mov    fs, ax    mov    gs, ax    mov    ss, ax    mov    eax, cr0    and    al, 11111110b    mov    cr0, eax    call    SelectorAA:0Code16Len    equ    $ - LABEL_SEG_CODE16


------解决方案--------------------------------------------------------
楼主,麻烦写一点注释,特别是汇编,你的程序不是进入死循环,你这个程序是崩溃啦!进入了保护模式中了,执行的应该是32位编译方式的代码([BITS 32]),执行的却是按照16位程序编译出来的代码[BITS 16], 楼主不要以为[BITS]是没有限制,乱用的,具体的细节你自己到nasm的官网上找文档吧,有详细的介绍。程序中是要使用32位的代码做中转的,不能直接跳转的。
------解决方案--------------------------------------------------------
中断之类的恢复了吗?