📄 asm9.asm
字号:
;名称:ASM9.ASM
;功能:演示I/O保护及I/O敏感指令的作用
;编译:TASM ASM9.ASM
;连接:TLINK /32 ASM9.OBJ
;----------------------------------------------------------------------------
INCLUDE 386SCD.INC
;----------------------------------------------------------------------------
GDTSeg SEGMENT PARA USE16 ;全局描述符表段(16位)
GDT LABEL BYTE
;空描述符
DUMMY Desc <>
;规范段描述符及选择子
Normal Desc <0ffffh,,,ATDW,,>
Normal_Sel = Normal-GDT
;视频缓冲区段描述符(DPL=3)及选择子(任何特权级可写)
VideoBuf Desc <07fffh,8000h,0bh,ATDW,,>
VideoBuf_Sel = VideoBuf-GDT
;----------------------------------------------------------------------------
EFFGDT LABEL BYTE
;演示任务TSS段描述符及选择子
DemoTSS Desc <DemoTSSLen-1,DemoTSSSeg,,AT386TSS,,>
DemoTSS_Sel = DemoTSS-GDT
;演示任务堆栈段描述符及选择子
DemoStack Desc <DemoStackLen-1,DemoStackSeg,,ATDW,D32,>
DemoStack_Sel = DemoStack-GDT
;演示代码段描述符及选择子
DemoCode Desc <DemoCodeLen-1,DemoCodeSeg,,ATCE,D32,>
DemoCode_Sel = DemoCode-GDT
;属于演示任务的临时代码段描述符及选择子
TempCode Desc <0ffffh,TempCodeSeg,,ATCE,,>
TempCode_Sel = TempCode-GDT
;指向GDT的存储段描述符及选择子
ToGDT Desc <GDTLen-1,GDTSeg,,ATDW,,>
ToGDT_Sel = ToGDT-GDT
;指向通用保护故障处理任务TSS的存储段描述符及选择子
ToGPTSS Desc <GPTSSLen-1,GPTSSSeg,,ATDW,,>
ToGPTSS_Sel = ToGPTSS-GDT
;指向测试任务TSS的存储段描述符及选择子
ToTestTSS Desc <TestTSSLen-1,TestTSSSeg,,ATDW,,>
ToTestTSS_Sel = ToTestTSS-GDT
;测试任务TSS段描述符及选择子
TestTSS Desc <TestTSSLen-1,TestTSSSeg,,AT386TSS,,>
TestTSS_Sel = TestTSS-GDT
;测试任务1堆栈段描述符(DPL=1)及选择子
Test1Stack Desc <TestStackLen-1,TestStackSeg,,ATDW+DPL1,D32,>
Test1Stack_Sel = Test1Stack-GDT+RPL1
;测试任务1代码段描述符(DPL=1)及选择子
Test1Code Desc <TestCodeLen-1,TestCodeSeg,,ATCE+DPL1,D32,>
Test1Code_Sel = Test1Code-GDT+RPL1
;测试任务2堆栈段描述符(DPL=2)及选择子
Test2Stack Desc <TestStackLen-1,TestStackSeg,,ATDW+DPL2,D32,>
Test2Stack_Sel = Test2Stack-GDT+RPL2
;测试任务2代码段描述符(DPL=2)及选择子
Test2Code Desc <TestCodeLen-1,TestCodeSeg,,ATCE+DPL2,D32,>
Test2Code_Sel = Test2Code-GDT+RPL2
;测试任务3堆栈段描述符(DPL=3)及选择子
Test3Stack Desc <TestStackLen-1,TestStackSeg,,ATDW+DPL3,D32,>
Test3Stack_Sel = Test3Stack-GDT+RPL3
;测试任务3代码段描述符(DPL=3)及选择子
Test3Code Desc <TestCodeLen-1,TestCodeSeg,,ATCE+DPL3,D32,>
Test3Code_Sel = Test3Code-GDT+RPL3
;通用保护故障处理任务的TSS段描述符及选择子
GPTSS Desc <GPTSSLen-1,GPTSSSeg,,AT386TSS,,>
GPTSS_Sel = GPTSS-GDT
;通用保护故障处理任务的堆栈段描述符及选择子
GPStack Desc <GPStackLen-1,GPStackSeg,,ATDW,D32,>
GPStack_Sel = GPStack-GDT
;通用保护故障处理任务的代码段描述符及选择子
GPCode Desc <GPCodeLen-1,GPCodeSeg,,ATCE,D32,>
GPCode_Sel = GPCode-GDT
;其它中断或异常处理程序代码段(一致可读)描述符及选择子
ErrCode Desc <ErrCodeLen-1,ErrCodeSeg,,ATCCOR,D32,>
ErrCode_Sel = ErrCode-GDT
;----------------------------------------------------------------------------
GDNum = ($-EFFGDT)/(SIZE Desc) ;需处理基地址的描述符个数
;----------------------------------------------------------------------------
;指向测试任务的任务门
TestTask Gate <,TestTSS_Sel,,ATTaskGate,>
Test_Sel = TestTask-GDT
;----------------------------------------------------------------------------
GDTLen = $-GDT ;全局描述符表长度
GDTSeg ENDS ;全局描述符表段定义结束
;----------------------------------------------------------------------------
IDTSeg SEGMENT PARA USE16 ;中断描述符表段(16位)
IDT LABEL BYTE ;中断描述符表
REPT 13
Gate <ErrBegin,ErrCode_Sel,,AT386TGate,>
ENDM
Gate <,GPTSS_Sel,,ATTaskGate,> ;通用故障处理程序门描述符
REPT 242
Gate <ErrBegin,ErrCode_Sel,,AT386TGate,>
ENDM
;----------------------------------------------------------------------------
IDTLen = $-IDT
;----------------------------------------------------------------------------
IDTSeg ENDS ;中断描述符表段定义结束
;----------------------------------------------------------------------------
;其它中断或异常处理程序的代码段(一致可读)
;----------------------------------------------------------------------------
ErrCodeSeg SEGMENT PARA USE32
ASSUME CS:ErrCodeSeg
;----------------------------------------------------------------------------
ErrMess DB 'Error!!!'
ErrMessLen = $-ErrMess
;----------------------------------------------------------------------------
ErrBegin PROC FAR
cld
mov ax,ErrCode_Sel
mov ds,ax
lea esi,ErrMess
mov ax,VideoBuf_Sel
mov es,ax
mov edi,1992
mov ecx,ErrMessLen
mov ah,4eh
Err1: lodsb
stosw
loop Err1
jmp $
ErrBegin ENDP
;----------------------------------------------------------------------------
ErrCodeLen = $
ErrCodeSeg ENDS
;----------------------------------------------------------------------------
GPTSSSeg SEGMENT PARA USE16 ;通用保护故障处理任务的TSS
GPTaskSS LABEL BYTE
DD 0 ;任务嵌套时的链接指针
DD 0 ;0级堆栈偏移
DW 0,0 ;0级堆栈选择子
DD 0 ;1级堆栈偏移
DW 0,0 ;1级堆栈选择子
DD 0 ;2级堆栈偏移
DW 0,0 ;2级堆栈选择子
DD 0 ;CR3
DW GPBegin,0 ;EIP
DD 0 ;EFLAGS
DD 0 ;EAX
DD 0 ;ECX
DD 0 ;EDX
DD 0 ;EBX
DD GPStackLen ;ESP
DD 0 ;EBP
DD 0 ;ESI
DD 0 ;EDI
DW VideoBuf_Sel,0 ;ES
DW GPCode_Sel,0 ;CS
DW GPStack_Sel,0 ;SS
DW ToTestTSS_Sel,0 ;DS
DW ToGPTSS_Sel,0 ;FS
DW 0,0 ;GS
DW 0,0 ;LDTR
DW 0 ;调试陷阱标志
DW $+2 ;指向I/O许可位图的偏移
DB 0ffh ;I/O许可位图结束标志
GPTSSLen = $
GPTSSSeg ENDS
;----------------------------------------------------------------------------
GPStackSeg SEGMENT PARA USE32 ;通用保护故障处理任务堆栈段
GPStackLen = 512
DB GPStackLen DUP(0)
GPStackSeg ENDS
;----------------------------------------------------------------------------
;通用保护故障处理程序代码段
;----------------------------------------------------------------------------
GPCodeSeg SEGMENT PARA USE32
ASSUME CS:GPCodeSeg
;----------------------------------------------------------------------------
GPBegin PROC FAR
;在屏幕左上角显示故障点
xor edi,edi
mov ebx,OFFSET TestTaskSS
mov edx,DWORD PTR [ebx].TRCS
call EchoEDX
mov ax,(17h SHL 8)+':'
stosw
mov edx,[ebx].TREIP
call EchoEDX
;演示以便看清故障点
mov ecx,1234567h
loop $
;调整任务链接指针,中止故障任务
mov ebx,OFFSET GPTaskSS
mov ax,DemoTSS_Sel
mov fs:[ebx].TRLink,ax
add esp,4
iretd
jmp GPBegin
GPBegin ENDP
;----------------------------------------------------------------------------
;显示edx内容的子程序
;----------------------------------------------------------------------------
EchoEDX PROC
mov ah,17h
mov ecx,8
EchoEDX1: rol edx,4
mov al,dl
call HToASCII
stosw
loop EchoEDX1
ret
EchoEDX ENDP
;----------------------------------------------------------------------------
;把4位二进制数转换成对应的ASCII码
;----------------------------------------------------------------------------
HToASCII PROC
and al,0fh
add al,90h
daa
adc al,40h
daa
ret
HToASCII ENDP
;----------------------------------------------------------------------------
GPCodeLen = $
GPCodeSeg ENDS
;----------------------------------------------------------------------------
;测试任务的TSS段
TestTSSSeg SEGMENT PARA USE16
TestTaskSS TSS <> ;TSS的固定格式部分
IOMap LABEL BYTE ;I/O许可位图
DB 8 DUP(0ffh) ;端口00h--3fh
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -