📄 asm7.asm
字号:
OtherCodeSeg SEGMENT PARA USE16
ASSUME CS:OtherCodeSeg
;----------------------------------------------------------------------------
OtherBegin PROC FAR
mov si,OFFSET MessOther
int 0feh ;显示提示信息
mov WORD PTR es:[0],ax
jmp $ ;进入无限循环
OtherBegin ENDP
;----------------------------------------------------------------------------
OtherCodeLen = $
OtherCodeSeg ENDS
;----------------------------------------------------------------------------
;除法出错故障处理程序代码段
;----------------------------------------------------------------------------
DivCodeSeg SEGMENT PARA USE16
ASSUME CS:DivCodeSeg
;----------------------------------------------------------------------------
DivBegin PROC FAR
mov si,OFFSET Mess0
mov di,0
int 0feh ;显示提示信息
shr ax,1 ;处理模拟的除法错误
iretd ;返回
DivBegin ENDP
;----------------------------------------------------------------------------
DivCodeLen = $
DivCodeSeg ENDS
;----------------------------------------------------------------------------
;溢出陷阱处理程序代码段
;----------------------------------------------------------------------------
OFCodeSeg SEGMENT PARA USE16
ASSUME CS:OFCodeSeg
;----------------------------------------------------------------------------
OFBegin PROC FAR
mov si,OFFSET Mess4
mov di,0
int 0feh ;显示提示信息
iretd ;返回
OFBegin ENDP
;----------------------------------------------------------------------------
OFCodeLen = $
OFCodeSeg ENDS
;----------------------------------------------------------------------------
;段不存在故障处理程序代码段
;----------------------------------------------------------------------------
SNPCodeSeg SEGMENT PARA USE16
ASSUME CS:SNPCodeSeg
;----------------------------------------------------------------------------
SNPBegin PROC FAR
mov si,OFFSET MessB
mov di,0
int 0feh ;显示提示信息
pop eax ;弹出出错代码
CALL16 SubCode_Sel,SubBegin ;显示出错代码
pop eax
add eax,2 ;按模拟的引起段不存在指令
push eax ;调整返回地址
iretd
SNPBegin ENDP
;----------------------------------------------------------------------------
SNPCodeLen = $
SNPCodeSeg ENDS
;----------------------------------------------------------------------------
;堆栈段故障处理程序代码段
;----------------------------------------------------------------------------
SSECodeSeg SEGMENT PARA USE16
ASSUME CS:SSECodeSeg
;----------------------------------------------------------------------------
SSEBegin PROC FAR
mov si,OFFSET MessC
mov di,0
int 0feh ;显示提示信息
pop eax ;弹出出错代码
CALL16 SubCode_Sel,SubBegin ;显示出错代码
pop eax
add eax,4 ;按模拟的引起堆栈段错误的
push eax ;指令调整返回地址
iretd
SSEBegin ENDP
;----------------------------------------------------------------------------
SSECodeLen = $
SSECodeSeg ENDS
;----------------------------------------------------------------------------
;通用保护故障处理程序代码段
;----------------------------------------------------------------------------
GPCodeSeg SEGMENT PARA USE16
ASSUME CS:GPCodeSeg
;----------------------------------------------------------------------------
GPBegin PROC FAR
push ebp
mov ebp,esp
push eax
push esi
push edi ;保护现场
mov si,OFFSET MessD
mov di,0
int 0feh ;显示提示信息
mov eax,[bp+4] ;从堆栈中取出出错代码
CALL16 SubCode_Sel,SubBegin ;显示出错代码
pop edi
pop esi
pop eax ;恢复部分现场
add DWORD PTR [ebp+8],2 ;按模拟的故障指令调整返回
pop ebp ;地址
add esp,4 ;废除堆栈中的出错代码
iretd
GPBegin ENDP
;----------------------------------------------------------------------------
;显示出错码过程代码段
;----------------------------------------------------------------------------
SubCodeSeg SEGMENT PARA USE16
ASSUME CS:SubCodeSeG
;----------------------------------------------------------------------------
SubBegin PROC ;AX中含出错代码
push ax ;保护现场
push cx
push dx
push si
push di
mov si,OFFSET ErrCode
mov dx,ax
mov cx,4
SubR1: rol dx,4 ;把16位出错代码转换成4位
mov al,dl ;十六进制数的ASCII码并保存
and al,0fh
add al,30h
cmp al,'9'
jbe SubR2
add al,7
SubR2: mov [si],al
inc si
loop SubR1
mov si,OFFSET ErrMess
Mov di,80*2 ;从第二行行首开始
int 0feh ;显示出错码
pop di ;恢复现场
pop si
pop dx
pop cx
pop ax
retf ;返回
SubBegin ENDP
;----------------------------------------------------------------------------
SubCodeLen = $
SubCodeSeg ENDS
;----------------------------------------------------------------------------
GPCodeLen = $
GPCodeSeg ENDS
;----------------------------------------------------------------------------
;实现显示的陷阱处理程序代码段
;入口参数--DS:SI指向显示信息串,ES:DI指向显示缓冲区
;----------------------------------------------------------------------------
EchoCodeSeg SEGMENT PARA USE16
ASSUME CS:EchoCodeSeg
;----------------------------------------------------------------------------
EchoBegin PROC FAR
pushad ;保护现场
cld
mov ah,7
mov al,20h
mov cx,80
push di
rep stosw ;清所在显示行
pop di
Echo1: lodsb
or al,al
jz Echo2
stosw ;显示指定信息串
jmp Echo1
Echo2: popad ;恢复现场
iretd
EchoBegin ENDP
;----------------------------------------------------------------------------
EchoCodeLen = $
EchoCodeSeg ENDS
;----------------------------------------------------------------------------
;缓冲区数据段
;----------------------------------------------------------------------------
BufferSeg SEGMENT PARA USE16
KeyASCII DB ?
Buffer DB 128 DUP(?)
BufferLen = $
BufferSeg ENDS
;----------------------------------------------------------------------------
;演示任务局部描述符表段
;----------------------------------------------------------------------------
DemoLDTSeg SEGMENT PARA USE16
;----------------------------------------------------------------------------
DLDT LABEL BYTE
;演示任务TSS段作为数据段的描述符及选择子
ToDemoTSS Desc <DemoTSSLen-1,DemoTSSSeg,,ATDW,,>
ToDemoTSS_Sel = ToDemoTSS-DLDT+TIL
;演示任务堆栈段描述符及选择子
DemoStack Desc <DemoStackLen-1,DemoStackSeg,,ATDWA,,>
DemoStack_Sel = DemoStack-DLDT+TIL
;演示任务数据段描述符及选择子
DemoData Desc <DemoDataLen-1,DemoDataSeg,,ATDW,,>
DemoData_Sel = DemoData-DLDT+TIL
;除法出错故障处理程序代码段描述符及选择子
Divide Desc <DivCodeLen-1,DivCodeSeg,,ATCE,,>
Divide_Sel = Divide-DLDT+TIL
;溢出陷阱处理程序代码段描述符及选择子
OverFlow Desc <OFCodeLen-1,OFCodeSeg,,ATCE,,>
OF_Sel = OverFlow-DLDT+TIL
;段不存在故障处理程序代码段描述符及选择子
SNPCode Desc <SNPCodeLen-1,SNPCodeSeg,,ATCE,,>
SNP_Sel = SNPCode-DLDT+TIL
;堆栈段出错故障处理程序代码段描述符及选择子
SSECode Desc <SSECodeLen-1,SSECodeSeg,,ATCE,,>
SSE_Sel = SSECode-DLDT+TIL
;通用保护故障处理程序代码段描述符及选择子
GPCode Desc <GPCodeLen-1,GPCodeSeg,,ATCE,,>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -