鱼C论坛

 找回密码
 立即注册
查看: 2471|回复: 2

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

[复制链接]
发表于 2011-11-29 23:34:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

---------------------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
[section .gdt]
gdt_null: Descriptor 0,0,0
gdt_code: Descriptor 0,seg_code_32_len-1,9ah|4000h
gdt_video:Descriptor 0B8000H,0FFFFH,92ah
;[section gdt]
;GDTR寄存器结构
gdt_len  equ $-1
gdtr_ptr  dw gdt_len-1
          dd 0
   
;选择子
selector_code  equ gdt_code-gdt_null
selector_video equ gdt_video-gdt_null

;实模式下对保护模式进行初始化
[section .s16]
[bits 16]   
main_start:
;对各段进行初始化
mov ax,cs
mov ds,ax
mov es,ax
mov ss,ax
mov sp, 0100h

;对代码段描述符初始化
mov eax,seg_code_32
mov word[gdt_code+2],ax
shr eax,16
mov byte[gdt_code+4],al
mov byte[gdt_code+7],ah

;准备加载GDTR
mov eax,gdt_null
mov dword[gdtr_ptr+2],eax
;加载GDTR
lgdt [gdtr_ptr]
;关中断
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

;以下是在保护模式下操作
[section .code_32]
[bits 32]
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 [gs:edi], ax
    jmp $
seg_code_32_len  equ $-seg_code_32

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2011-11-29 23:42:57 | 显示全部楼层
这本书还是有一定难度的,特别是到了保护模式以后。建议先对一个操作系统平台熟悉了以后再深入研究
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
 楼主| 发表于 2011-11-30 06:55:45 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-5 09:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表