实模式下不能访问1M以上的内存,而且实模式不能提供内存保护。
  启示开启实模式只要3个步骤
  1.设置gdt全局描述符表
  2.设置a20开始访问1M以上内存的必须步骤
  3.设置cr0的pe为1,这个表明已经进入了保护模式中。
;
;protect.ASM
;
;
;
SECTION ALIGN=16 VSTART=0x7E00
MOV AX , [cs:SS_BASE]
MOV SS , AX
XOR SP , SP
MOV AX , [cs:DS_BASE]
MOV DS , AX
MOV BX ,  0x7C00
;创建#1描述符,保护模式下的代码段描述符
mov dword [bx],0x0
mov dword [bx+0x04],0x0
;创建#1描述符,保护模式下的代码段描述符
mov dword [bx+0x08],0x7e0001ff
mov dword [bx+0x0c],0x00409800
;创建#2描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
mov dword [bx+0x10],0x8000ffff
mov dword [bx+0x14],0x0040920b
;创建#3描述符,保护模式下的堆栈段描述符
mov dword [bx+0x18],0x00007a00
mov dword [bx+0x1c],0x00409600
;创建#4描述符,保护模式下的代码段描述符
mov dword [bx+0x20],0x7e0001ff
mov dword [bx+0x24],0x00F09800
;创建#5描述符,保护模式下的数据段描述符(文本模式下的显示缓冲区)
mov dword [bx+0x28],0x8000ffff
mov dword [bx+0x2C],0x00F0920b
;创建#6描述符,保护模式下的堆栈段描述符
mov dword [bx+0x30],0x00007a00
mov dword [bx+0x34],0x00F09600
mov bx , GDT_SIZE
mov word [bx] , 47
mov dword [bx+2], 0x7C00
lgdt [bx]
in al , 0x92
or al , 0000_0010B
out 0x92,al
cli
mov eax , cr0
or eax , 0x01
mov cr0 ,eax
jmp dword 0x0008:(PROTECT_BEGIN-0x7E00)
DS_BASE DW 0x0000
SS_BASE DW 0x2000
[bits 32]
ZERO_SECTOR    DD 0x0,0x0
CS_SECTOR      DD 0x0,0x0
DS_SECTOR      DD 0x0,0x0
SS_SECTOR      DD 0x0,0x0
CS_DPL3_SECTOR DD 0x0,0x0
DS_DPL3_SECTOR DD 0x0,0x0
GDT_SIZE       DW 0x00
DGT_BASE       DD 0x00000000
PROTECT_BEGIN:
mov ax , 16
mov ds , ax
mov byte [0] , 'P'
mov byte [1] , 0x07
mov byte [2] , 'r'
mov byte [3] , 0x07
mov byte [4] , 'o'
mov byte [5] , 0x07
mov byte [6] , 't'
mov byte [7] , 0x07
mov byte [8] , 'e'
mov byte [9] , 0x07
mov byte [10] , 'c'
mov byte [11] , 0x07
mov byte [12] , 't'
mov byte [13] , 0x07
jmp $
times 512 - ($-$$) db 0
上一页12下一页
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。