最近忙着画X86主板没能及时写操作系统,时隔3月前面代码又复习下,应该到保护模式了。
OSLDR.ASM:
JMP BEGIN_OSLDR
LABEL_GDT: DQ 0 ;保留
LABEL_CODE: DQ 0X00C09A0000000000 ;C09A根据附表
LABEL_VIDE: DQ 0X00C0920B8000FFFF ;C092根据附表,000B8000H为显存地址,界限FFFFH
GdtPtr DW 24 ;3x8字节=24
DD 0
SelectorCODE EQU LABEL_CODE - LABEL_GDT
SelectorVIDE EQU LABEL_VIDE - LABEL_GDT
BEGIN_OSLDR:
XOR EAX,EAX
MOV AX,CS
MOV DS,AX
MOV ES,AX
SHL EAX,4
ADD EAX,CODE32_ADDR ;把CODE32_ADDR物理地址存入LABEL_CODE指定位
MOV WORD[LABEL_CODE + 2],AX ;基地址0-15位
SHR EAX,16
MOV BYTE[LABEL_CODE + 4],AL ;基地址16-23位
MOV BYTE[LABEL_CODE + 7],AH ;基地址24-31位
XOR EAX,EAX
MOV AX,DS
SHL EAX,4 ;段基值x10H+偏移量
ADD EAX,LABEL_GDT ;EAX=LABEL_GDT物理地址
MOV DWORD[GdtPtr+2],EAX
LGDT [GdtPtr]
CLI
I