|
START:
[BITS 16]
ORG 7C00H
CLD ;方向标准
LABLE_GEGIN:
MOV AX,CS
MOV SS,AX
MOV ES,AX
MOV DS,AX
MOV SP,1000H
MOV EAX,GDT_LABEL ;得到全局描述表首地址
MOV [GDTR1],EAX ;将全局描述表首地址放入GDTR中
LGDT [GDTR_LABEL] ;加载GDTR
;设置显示模式
MOV AX,4F02H
MOV BX,0114H ;;MOV BX,4114H也是一样
INT 10H
;得到当前显示模式信息,并保存到段描述符中
MOV AX,4F01H
MOV CX,0114H
;;存储显存线性基地值=8000H
MOV BX,8000H
MOV ES,BX
MOV DI,01H
INT 10H
MOV EAX,[ES:DI+40] ;显存的线性基地址
MOV [ES:00],EAX
;将32位代码复制到00H
XOR AX,AX
MOV DS,AX
MOV SI,START32
XOR AX,AX
MOV ES,AX
MOV DI,AX
MOV CX,100H
REP MOVSW
CLI
;;打开a20线
IN AL,92H
OR AL,02H
OUT 92H,AL
;为32位坐准备
MOV AX,VOIE32
MOV DS,AX
MOV SS,AX
MOV ES,AX
MOV FS,AX
MOV GS,AX
;;进入保护模式
MOV EAX,CR0
OR EAX,01
MOV CR0,EAX
JMP DWORD CODE32:0
;;GDT
GDT_LABEL: ;以下为高到低位编码
GDT0: DD 00000000H
DD 00000000H
;1:代码段:基地值=7C00H
GDT1: DD 00000000H
DD 00CF9B00H
;2:显卡基地值=未定
GDT2: DD 0000FFFFH
DD 00CF9300H
;;选择子
CODE32 EQU 0008H
VOIE32 EQU 0010H
GDTR_LABEL DW 0200H ;限长
GDTR1 DD 00000000H ;基址
;GDT结束
[BITS 32]
START32:
MOV EAX,01056009H
MOV EBX,[DS:80000]
XOR ESI,ESI
LSHOW:
MOV [DS:EBX+ESI],EAX
ADD ESI,4
JMP LSHOW
TIMES 510-($-$$) DB 00H
DW 0AA55H
;;使用NAME编译成一个Bin文件。使用Virtual 2007
运行只能填充屏幕上的一个部分
图:附件中
谢谢各位帮忙看一看,是什么问题。谢谢了
|
|