<四>显示关键寄存器内容的实例(实例八) 为了更好地说明操作系统类指令的使用,下面给出一个显示80386关键寄存器内容的实例。该实例的逻辑功能是,显示系统中GDTR、IDTR、LDTR和TR等关键寄存器的当前内容。实例八的源程序清单如下: INCLUDE 386SCD.INCGDTSeg SEGMENT PARA USE16 GDT LABEL BYTE DUMMY Desc <> Normal Desc <0ffffh,,,ATDW,,>Normal_Sel = Normal-GDTEFFGDT LABEL BYTE TempCode Desc <0ffffh,TempCodeSeg,,ATCE,,>TempCode_Sel = TempCode-GDT Buffer Desc <BufferLen-1,BufferSeg,,ATDW,,>Buffer_Sel = Buffer-GDT Test1 Desc <1111h,,,92h,87h,>Test1_Sel = Test1-GDTTestR_Sel = Test1-GDT+RPL3 Test2 Desc <2222h,,,82h,17h,>Test2_Sel = Test1-GDTGDNum = ($-EFFGDT)/(SIZE Desc) GDTLen = $-GDT GDTSeg ENDS BufferSeg SEGMENT PARA USE16 GDTR_V PDesc <> IDTR_V PDesc <> MSW_V DW 0 LDTR_V DW 0 TR_V DW 0 CR0_V DD 0 CR3_V DD 0 DR7_V DD 0 Test_RPL DW 0Test1_SLD DD 0 Test1_ARD DD 0Test1_SLW DW 0Test1_ARW DW 0Test1_RF DW 0Test1_WF DW 0Test2_SLD DD 0 Test2_ARD DD 0Test2_SLW DW 0Test2_ARW DW 0Test2_RF DW 0Test2_WF DW 0BufferLen = $BufferSeg ENDSTempCodeSeg SEGMENT PARA USE16 ASSUME CS:TempCodeSeg,DS:BufferSegVirtual PROC FAR mov ax,Buffer_Sel mov ds,ax mov eax,cr0 mov CR0_V,eax mov eax,cr3 mov CR3_V,eax mov eax,DR7 mov DR7_V,eax str TR_V sldt LDTR_V mov Test_RPL,Test1_Sel mov ax,TestR_Sel arpl Test_RPL,ax mov bx,0 mov ax,Test1_SelLab1: 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],1Lab2: mov Test1_WF[bx],0 verw ax jnz Lab3 mov Test1_WF[bx],1Lab3: 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 ENDPTempCodeSeg ENDSRCodeSeg SEGMENT PARA USE16 ASSUME CS:RCodeSeg,DS:BufferSegVGDTR 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 21hStart ENDPInitGDT PROC push ds mov ax,GDTSeg mov ds,ax mov cx,GDNum mov si,OFFSET EFFGDTInitG: 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 retInitGDT ENDPRCodeSeg ENDS END Start <五>特权指令 特权指令是指保护方式下只有当前特权级CPL=0时,才可执行的指令。如果CPL不等于0而执行它们,那么会引起通用保护异常。从上面介绍的操作系统类指令可归纳出如下表所示的80386特权指令。这些特权指令在构成完善的保护机制方面起了重要的作用。
特 权 指 令 | 指 令 | 功 能 | 指 令 | 功 能 | 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位) | | |
从上表可见,装入GDTR、IDTR、LDTR、TR和MSW的指令都是特权指令,而存储上述寄存器的指令不是特权指令。这表示,保护模式下任何程序可获得这些寄存器的值,但只有特权级0的程序才能够改变这些寄存器的值。从上表还可以看出,设置和存储控制寄存器及调试寄存器的指令都是特权指令。  
2/2 首页 上一页 1 2 |