SGDT QWORD PTR DST
SIDT QWORD PTR DST
SMSW DST
CLTS
HLT
LGDT QWORD PTR SRC
LIDT QWORD PTR SRC
LMSW DST
MOV DST,SRC
LLDT SRC
SLDT DST
LTR SRC
STR DST
ARPL OPRD1,OPRD2
LAR OPRD1,OPRD2
LSL OPRD1,OPRD2
VERR OPRD
VERW OPRD
;名称:ASM8.ASM
;功能:显示关键寄存器内容及说明操作系统类指令的使用
;编译:TASM ASM8.ASM
;连接:TLINK ASM8.OBJ
;----------------------------------------------------------------------------
INCLUDE 386SCD.INC
;----------------------------------------------------------------------------
GDTSeg SEGMENT PARA USE16 ;全局描述符表数据段(16位)
;----------------------------------------------------------------------------
GDT LABEL BYTE
;空描述符
DUMMY Desc <>
;规范段描述符及选择子
Normal Desc <0ffffh,,,ATDW,,>
Normal_Sel = Normal-GDT
;----------------------------------------------------------------------------
EFFGDT LABEL BYTE
;临时任务代码段描述符及选择子
TempCode Desc <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel = TempCode-GDT
;缓冲区段描述符及选择子
Buffer Desc <BufferLen-1,BufferSeg,,ATDW,,>
Buffer_Sel = Buffer-GDT
;测试描述符1及选择子
Test1 Desc <1111h,,,92h,87h,>
Test1_Sel = Test1-GDT
TestR_Sel = Test1-GDT+RPL3
;测试描述符2及选择子
Test2 Desc <2222h,,,82h,17h,>
Test2_Sel = Test1-GDT
;----------------------------------------------------------------------------
GDNum = ($-EFFGDT)/(SIZE Desc) ;需特殊处理的描述符数
GDTLen = $-GDT ;全局描述符表长度
;----------------------------------------------------------------------------
GDTSeg ENDS ;全局描述符表段定义结束
;----------------------------------------------------------------------------
BufferSeg SEGMENT PARA USE16 ;缓冲区数据段
;----------------------------------------------------------------------------
GDTR_V PDesc <> ;存放GDTR
IDTR_V PDesc <> ;存放IDTR
;----------------------------------------------------------------------------
MSW_V DW 0 ;存放机器状态字
LDTR_V DW 0 ;存放LDTR选择子
TR_V DW 0 ;存放TR选择子
CR0_V DD 0 ;存放控制寄存器CR0
CR3_V DD 0 ;存放控制寄存器CR3
DR7_V DD 0 ;存放调试寄存器DR7
Test_RPL DW 0
;----------------------------------------------------------------------------
Test1_SLD DD 0 ;演示用变量
Test1_ARD DD 0
Test1_SLW DW 0
Test1_ARW DW 0
Test1_RF DW 0
Test1_WF DW 0
;----------------------------------------------------------------------------
Test2_SLD DD 0 ;演示用变量
Test2_ARD DD 0
Test2_SLW DW 0
Test2_ARW DW 0
Test2_RF DW 0
Test2_WF DW 0
;----------------------------------------------------------------------------
BufferLen = $
BufferSeg ENDS
;----------------------------------------------------------------------------
TempCodeSeg SEGMENT PARA USE16 ;临时代码段
ASSUME CS:TempCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
Virtual PROC FAR
mov ax,Buffer_Sel
mov ds,ax
mov eax,cr0 ;存储CR0
mov CR0_V,eax
mov eax,cr3 ;存储CR3
mov CR3_V,eax
mov eax,DR7 ;存储DR7
mov DR7_V,eax
str TR_V ;存储TR
sldt LDTR_V ;存储LDTR
mov Test_RPL,Test1_Sel
mov ax,TestR_Sel
arpl Test_RPL,ax ;说明调整申请特权及指令
mov bx,0
mov ax,Test1_Sel
Lab1: mov edx,0
mov cx,0
lsl edx,eax ;说明装载段界限指令
lsl cx,ax
mov Test1_SLD[bx],edx
mov Test1_SLW[bx],cx
mov edx,0
mov cx,0
lar edx,eax ;说明装载存取权指令
lar cx,ax
mov Test1_ARD[bx],edx
mov Test1_ARW[bx],cx
mov Test1_RF[bx],0
verr ax ;说明读检验指令
jnz Lab2
mov Test1_RF[bx],1
Lab2: mov Test1_WF[bx],0
verw ax ;说明写检验指令
jnz Lab3
mov Test1_WF[bx],1
Lab3: add bx,16
mov ax,Test2_Sel
cmp bx,32
jb Lab1
;准备返回实方式
mov ax,Normal_Sel
mov ds,ax
mov eax,cr0
and al,11111110b
mov cr0,eax ;返回实方式
JUMP16 <SEG Real>,<OFFSET Real>
Virtual ENDP
;----------------------------------------------------------------------------
TempCodeSeg ENDS
;----------------------------------------------------------------------------
RCodeSeg SEGMENT PARA USE16
ASSUME CS:RCodeSeg,DS:BufferSeg
;----------------------------------------------------------------------------
VGDTR PDesc <GDTLen-1,>
;----------------------------------------------------------------------------
Start PROC
mov ax,BufferSeg
mov ds,ax
sgdt GDTR_V
sidt IDTR_V
smsw MSW_V
;准备转入保护方式
push cs
pop ds
cld
call InitGDT
mov bx,OFFSET VGDTR
lgdt [bx]
cli
mov eax,cr0
or al,1
;转入保护方式
mov cr0,eax
JUMP16 <TempCode_Sel>,<OFFSET Virtual>
Real: ;回到实方式
sti
;为了简单,略去了显示相关变量内容的部分代码
mov ax,4c00h
int 21h
Start ENDP
;----------------------------------------------------------------------------
InitGDT PROC
push ds
mov ax,GDTSeg
mov ds,ax
mov cx,GDNum
mov si,OFFSET EFFGDT
InitG: mov ax,[si].BaseL
movzx eax,ax
shl eax,4
shld edx,eax,16
mov WORD PTR [si].BaseL,ax
mov BYTE PTR [si].BaseM,dl
mov BYTE PTR [si].BaseH,dh
add si,SIZE Desc
loop InitG
pop ds
mov bx,16
mov ax,GDTSeg
mul bx
mov WORD PTR VGDTR.Base,ax
mov WORD PTR VGDTR.Base+2,dx
ret
InitGDT ENDP
;----------------------------------------------------------------------------
RCodeSeg ENDS
END Start
| 特 权 指 令 |
指 令 | 功 能 | 指 令 | 功 能 |
| CLTS | 清除CR0中的TS位 | LTR | 装入TR寄存器 | |
| HLT | 停机 | MOV CRn,reg | 装入控制寄存器 | |
| LGDT | 装入GDTR寄存器 | MOV reg,CRn | 保存控制寄存器 | |
| LIDT | 装入IDTR寄存器 | MOV DRn,reg | 装入调试寄存器 | |
| LLDT | 装入LDTR寄存器 | MOV reg,DRn | 保存调试寄存器 | |
| LMSW | 装入MSW寄存器(CR0的低16位) |
| 参考资料 | 书 名 | 出 版 社 | 作 者 |
| 《保护方式下的80386及其编程》 | 清华大学出版社 | 周明德主编 | |
| 《80X86汇编语言程序设计教程》 | 清华大学出版社 | 扬季文主编 |