最近因为有个大作业要写计算器,故考虑重写除零中断给予提示
DATA SEGMENT
BUFFER1 DB 20 DUP(?)
B1N DB 0
BUFFER2 DB 20 DUP(?)
B2N DB 0
FORMULA DB 30
DB ?
CHAR DB 30 DUP('$')
DB '$'
WELCOME DB 'START TO ENTER THE FORMULA:',0AH,0DH,'$'
WARN DB 'You are tring to divide 0!',0AH,0DH,'$'
DATA ENDS
STACK SEGMENT STACK
S DB 256 DUP(?)
STACK ENDS
;换行回车宏
HHHC MACRO
MOV AH,2
MOV DL,0DH
INT 21H
MOV AH,2
MOV DL,0AH
INT 21H
ENDM
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA,SS:STACK
;重写除0中断************************************************************************
INT0 PROC FAR
PUSH DX
PUSH AX
MOV DX,OFFSET WARN
MOV AH,09H
INT 21H
POP AX
POP DX
MOV AH,4CH
INT 21H
IRET
INT0 ENDP
;***********************************************************************************
START:
MOV AX,0
MOV ES,AX
MOV DI,0
MOV AX,OFFSET INT0
CLD
STOSW
MOV AX,SEG INT0
STOSW
;将程序地址写入中断向量表
;************************************************************************************
MOV AX,DATA
MOV DS,AX
MOV ES,AX
MOV DX,OFFSET WELCOME
MOV AH,09H
INT 21H
MOV DX,OFFSET FORMULA ;将输入的式子放入FORMULA中,以CHAR的offset为首地址
MOV AH,0AH
INT 21H
;各个运算符的ascii码 '('-28h,')'-29h,'*'-2ah,'+'-2bh,'-'-2d,'/'2fh
MOV DX,OFFSET CHAR;输出刚才输入的计算式
MOV AH,09H
INT 21H
HHHC
;除零之后出现bug
;CALL INT0
;除零测试:先放着最后再测试
MOV BL,0
DIV BL
MOV AH,4CH
INT 21H
CODE ENDS
END START