这个汇编使用的是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位的代码做中转的,不能直接跳转的。
------解决方案--------------------------------------------------------
中断之类的恢复了吗?