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