Oo南瓜稀饭 发表于 2011-11-29 23:34:04

进入保护模式 的代码,帮我看看哪里错了,小弟谢了

这段代码,反复搞了几天几夜了,帮我看看哪里写错了,帮我挑错呀,急死了呀,谢谢叻

---------------------Descriptor.inc----------------------------------------
%macro Descriptor 3
dw %2 & 0FFFFh   
dw %1 & 0FFFFh   
db (%1 >> 16) & 0FFh   
dw ((%2 >> 8) & 0F00h) | (%3 & 0F0FFh)
db (%1 >> 24) & 0FFh   
%endmacro

-------------------------------------------------------------------------------------------------------

%include "Descriptor.inc"
org 07c00h
jmp main_start

gdt_null: Descriptor 0,0,0
gdt_code: Descriptor 0,seg_code_32_len-1,9ah|4000h
gdt_video:Descriptor 0B8000H,0FFFFH,92ah
;
;GDTR寄存器结构
gdt_lenequ $-1
gdtr_ptrdw gdt_len-1
          dd 0
   
;选择子
selector_codeequ gdt_code-gdt_null
selector_video equ gdt_video-gdt_null

;实模式下对保护模式进行初始化

   
main_start:
;对各段进行初始化
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp, 0100h

;对代码段描述符初始化
mov eax,seg_code_32
mov word,ax
shr eax,16
mov byte,al
mov byte,ah

;准备加载GDTR
mov eax,gdt_null
mov dword,eax
;加载GDTR
lgdt
;关中断
cli
;开启A20线
in al,92h
or al,00000010b
out 92h,al
;开启保护模式
mov eax,cr0
or eax,1
mov cr0,eax
;进行保护模式
jmp dword selector_code:0

;以下是在保护模式下操作


seg_code_32:
mov ax, selector_video
mov gs, ax   ; 视频段选择子(目的)
mov edi, (80 * 11 + 79) * 2 ; 屏幕第 11 行, 第 79 列。
mov ah, 0Ch   ; 0000: 黑底    1100: 红字
mov al, 'P'
mov , ax
    jmp $
seg_code_32_lenequ $-seg_code_32

川本姨夫 发表于 2011-11-29 23:42:57

这本书还是有一定难度的,特别是到了保护模式以后。建议先对一个操作系统平台熟悉了以后再深入研究

Oo南瓜稀饭 发表于 2011-11-30 06:55:45

川本姨夫 发表于 2011-11-29 23:42 static/image/common/back.gif
这本书还是有一定难度的,特别是到了保护模式以后。建议先对一个操作系统平台熟悉了以后再深入研究

嘻嘻,谢谢哈
页: [1]
查看完整版本: 进入保护模式 的代码,帮我看看哪里错了,小弟谢了