📄 test.asm
字号:
.386P
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;-----------------------STRUCTURES AND EQU------------------------------------
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;EQUS
BOOTSTRAP_BASE=7C0H
PE_ROOT=700H ;OUR FIRST PAGE ENTRY BASE ADDRESS
PD_ROOT=600H ;OUR FIRST PAGE DIRECTORY BASE ADDRESS
PDE_LEN=4H ;PAGE ENTRY OR DIRECTORY LENGTH
PD0_INDEX=0
PE7_INDEX=28
PE1_INDEX=4
PDBR_L=6000H
PDBR_H=0
PE1_ATTRIB=8003H ;DEFAULT DISPLAY RAM ATTRIB
PE1_BAS=0BH
PE7_ATTRIB=7003H ;DEFAULT PAGE ENTRY ATTRIB
PE7_BAS=0
PD0_ATTRIB=7003H ;DEFAULT PAGE DIRECTORY ATTRIB
PD0_BAS=0
ENPAGE=80000001H ;ENABLE PAGE MECHANISM
BOOT_CODE=8H
BOOT_DATA=10H
DISP_RAM=18H
INIT_CODE=20H
;STRUCTURES FOR SYSTEM DATA
DESC STRUC
LIM_0_15 DW 0
BAS_0_15 DW 0
BAS_16_23 DB 0
ACCESS DB 0
GRAN DB 0
BAS_24_31 DB 0
DESC ENDS
TABLE_REG STRUC
TABLE_LIM DW 0
TABLE_LINEAR DD 0
TABLE_REG ENDS
PAGE_FORMAT STRUC
PAGE_ATTRIB DW 0
PAGE_BAS DW 0
PAGE_FORMAT ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT CODE SEGMENT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DGROUP GROUP DSEG,DSEG2,DSEG3,DSEG4
;GDT SEGMENT AND SYSTEM RELATIVE SEGMENT SHARE THE SAME DATA SEGMENT
CSEG SEGMENT PARA PUBLIC 'INIT_BOOT_CODE' USE16
ASSUME CS:CSEG,DS:DGROUP
START:
XOR AX,AX
MOV ES,AX
MOV BX,7E00H
MOV AX,0207H
MOV CX,0002H
MOV DX,0000H
INT 13H
MOV AH,2H
MOV BH,0
MOV DH,10
MOV DL,19
INT 10H
CLI ;DISABLE EXTERNAL INTERRUPT
MOV AX,DGROUP
ADD AX,BOOTSTRAP_BASE
MOV DS,AX ;LOAD REAL DATA SEGMENT FOR GDT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT DATA SEGMENT DESCRIPTOR IN GDT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
XOR EBX,EBX
MOV BX,AX
SHL EBX,4
MOV DWORD PTR GDT_DESC.TABLE_LINEAR,EBX
MOV WORD PTR BOOT_DATA_DESC.BAS_0_15,BX
SHR EBX,16
MOV BYTE PTR BOOT_DATA_DESC.BAS_16_23,BL
MOV BYTE PTR BOOT_DATA_DESC.BAS_24_31,BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT BOOT_LOADER SEGMENT DESCRIPTOR IN GDT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
MOV AX,CSEG2
ADD AX,BOOTSTRAP_BASE
XOR EBX,EBX
MOV BX,AX
SHL EBX,4
MOV WORD PTR BOOT_CODE_DESC.BAS_0_15,BX
SHR EBX,16
MOV BYTE PTR BOOT_CODE_DESC.BAS_16_23,BL
MOV BYTE PTR BOOT_CODE_DESC.BAS_24_31,BH
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; INIT THE BASIC DATA STRUCTURE FOR PAGE MECHANISM
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LEA SI,PD0
MOV AX,PD_ROOT
MOV ES,AX
MOV DI,PD0_INDEX
MOV CX,PDE_LEN
REP MOVSB ;CONSTRUCT THE FIRST PAGE DIRECTORY
LEA SI,PE7
MOV AX,PE_ROOT
MOV ES,AX
MOV DI,PE7_INDEX
MOV CX,PDE_LEN
REP MOVSB ;WE TRANSLATE THE 7000H-8000H LINEAR
;ADDRESS AS IDENTITY PHYSICAL ADDRESS
LEA SI,PE1
MOV AX,PE_ROOT
MOV ES,AX
MOV DI,PE1_INDEX
MOV CX,PDE_LEN
REP MOVSB
MOV EAX,PDBR
MOV CR3,EAX ;LOAD PAGE TABLE BASE ADDRESS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; SWITCH TO PROTECTED MODE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
LGDT GDT_DESC
MOV EAX,CR0
OR EAX,ENPAGE
MOV CR0,EAX
DB 0EAH
DW 0
DW BOOT_CODE
CSEG ENDS
CSEG2 SEGMENT PARA PUBLIC 'MESS_DISP' USE32
MOV AX,DISP_RAM
MOV ES,AX
CLD
MOV EDI,0
MOV ECX,25*80
MOV EAX,0720H
REP STOSW
MOV AX,BOOT_DATA
MOV DS,AX
LEA ESI,HEAD
MOV EDI,0
MOV ECX,18
REP MOVSW
LEA ESI,KERNELOK
MOV EDI,160*2
MOV ECX,21
REP MOVSW
LEA ESI,PROTECTOK
MOV EDI,320*2
MOV ECX,31
REP MOVSW
LEA ESI,PAGEOK
MOV EDI,480*2
MOV ECX,18
REP MOVSW
LEA ESI,SYSOK
MOV EDI,640*2
MOV ECX,18
REP MOVSW
LEA ESI,PROMPT
MOV EDI,800*2
MOV ECX,20
REP MOVSW
HLT
DB 0EAH
DD 0
DW INIT_CODE
CSEG2 ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; GDT SEGMENT
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DSEG SEGMENT PARA PUBLIC 'GLOBAL_DESC' USE16
GDT_NULL_DESC DESC < >;NULL DESCRIPTOR
BOOT_CODE_DESC DESC <0FFFFH,,,98H,40H,>
BOOT_DATA_DESC DESC <0FFFFH,,,92H,40H,>
DISP_RAM_DESC DESC <0FFFFH,1000H,0,92H,40H,0>
INIT_CODE_DESC DESC <0FFFFH,7E00H,0,98H,40H,0>
INIT_DATA_DESC DESC <0FFFFH,8000H,0,92H,40H,0>
INIT_STACK_DESC DESC <0FFFFH,8000H,0,92H,40H,0>
; REST SPACE RESERVED FOR FURTHER ARRENGEMENT
; DB 64 DUP (0) ;RESERVE FOR 8 GDTS
DSEG ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;DATA SEGMENT FOR SYSTEM USE
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DSEG2 SEGMENT PARA PUBLIC 'INIT_DATA' USE16
GDT_DESC TABLE_REG <0FFH,>
DSEG2 ENDS
DSEG3 SEGMENT PARA PUBLIC 'INIT_PAGE' USE16
PDBR PAGE_FORMAT <PDBR_L,PDBR_H>
PD0 PAGE_FORMAT <PD0_ATTRIB,PD0_BAS>
PE1 PAGE_FORMAT <PE1_ATTRIB,PE1_BAS>
PE7 PAGE_FORMAT <PE7_ATTRIB,PE7_BAS>
DSEG3 ENDS
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; MESSAGES FOR DESPLAYING
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
DSEG4 SEGMENT PARA PUBLIC 'MESSAGE' USE16
IRED=0CH
BLIGREEN=8AH
BLIWHITE=8FH
IWHITE=0FH
HEAD DB 'O',IRED,'S',IRED,20H,IRED,'b',IRED,'o',IRED,'o',IRED
DB 't',IRED,20H,IRED,'l',IRED,'o',IRED,'a',IRED,'d',IRED
DB 'e',IRED,'r',IRED,20H,IRED,'1',IWHITE,'.',IWHITE,'0',IWHITE
KERNELOK DB 'L',IWHITE,'o',IWHITE,'a',IWHITE,'d',IWHITE,'i',IWHITE,'n',IWHITE
DB 'g',IWHITE,20H,IWHITE,'k',IWHITE,'e',IWHITE,'r',IWHITE,'n',IWHITE
DB 'e',IWHITE,'l',IWHITE,20H,IWHITE,'.',IWHITE,'.',IWHITE,'.',IWHITE
DB 20H,IWHITE,'O',BLIGREEN,'K',BLIGREEN
PROTECTOK DB 'S',IWHITE,'w',IWHITE,'i',IWHITE,'t',IWHITE,'c',IWHITE,'h',IWHITE
DB 20H,IWHITE,'t',IWHITE,'o',IWHITE,20H,IWHITE,'p',IWHITE,'r',IWHITE
DB 'o',IWHITE,'t',IWHITE,'e',IWHITE,'c',IWHITE,'t',IWHITE,'e',IWHITE
DB 'd',IWHITE,20H,IWHITE,'m',IWHITE,'o',IWHITE,'d',IWHITE,'e',IWHITE
DB 20H,IWHITE,'.',IWHITE,'.',IWHITE,'.',IWHITE,20H,IWHITE,'O',BLIGREEN,'K',BLIGREEN
PAGEOK DB 'E',IWHITE,'n',IWHITE,'a',IWHITE,'b',IWHITE,'l',IWHITE,'e',IWHITE
DB 20H,IWHITE,'p',IWHITE,'a',IWHITE,'g',IWHITE,'e',IWHITE
DB 20H,IWHITE,'.',IWHITE,'.',IWHITE,'.',IWHITE,20H,IWHITE,'O',BLIGREEN,'K',BLIGREEN
SYSOK DB 'S',IWHITE,'y',IWHITE,'s',IWHITE,'t',IWHITE,'e',IWHITE,'m',IWHITE,20H,IWHITE
DB 'i',IWHITE,'n',IWHITE,'i',IWHITE,'t',IWHITE
DB 20H,IWHITE,'.',IWHITE,'.',IWHITE,'.',IWHITE,20H,IWHITE,'O',BLIGREEN,'K',BLIGREEN
PROMPT DB '[',IWHITE,'Z',IWHITE,'h',IWHITE,'o',IWHITE,'u',IWHITE,'6',IWHITE,'1',IWHITE
DB '1',IWHITE,'6',IWHITE,'@',IWHITE,'1',IWHITE,'6',IWHITE,'3',IWHITE,'.',IWHITE
DB 'c',IWHITE,'o',IWHITE,'m',IWHITE,']',IWHITE,'#',IWHITE,20H,IWHITE
DSEG4 ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -