📄 xndex.asm
字号:
;-------------------------------------------------------
;xndex.asm
;simple arithmetic
;-------------------------------------------------------
STACK SEGMENT PARA STACK 'STACK'
DB 50 DUP(0)
STACK ENDS
DATA SEGMENT
NUM1 DW ?
NUM2 DW ?
RESU1 DW ?
RESU2 DW ?
OPAT DB ?
WQ10 DW 10000,1000,100,10,1
MES1 DB 0DH,0AH,0DH,0AH
DB ' Input 1st number:$'
MES2 DB 0DH,0AH,' Input operator (+-*/): $'
MES3 DB 0DH,0AH,' Input 2nd number: $'
MES4 DB 0DH,0AH,' Result is: $'
MES5 DB 0DH,0AH
DB ' *********************************',0DH,0AH
DB ' * simple arithmetic (xndex) *',0DH,0AH
DB ' * 1. 16 bits precision *',0DH,0AH
DB ' * 2. support input a expression *',0DH,0AH
DB ' * 3. 16 bits number input limit *',0DH,0AH
DB ' * 4. deal with result overflow *',0DH,0AH
DB ' * by tenudy 12-11-2004 *',0DH,0AH
DB ' *********************************$'
MES6 DB 0DH,0AH,0DH,0AH
DB ' Unknown error',0DH,0AH,'$'
MES7 DB 0DH,0AH,0DH,0AH
DB ' Program end',0DH,0AH,'$'
MES8 DB 0DH,0AH,0DH,0AH
DB ' Exit program (y/n)?$'
MES9 DB 0DH,0AH,' Product overflow.$'
MESA DB 0DH,0AH,' The low 16bits result is: $'
MESB DB 0DH,0AH,' Summation overflow.$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START PROC NEAR
MOV AX,DATA
MOV DS,AX
LEA DX,MES5 ;显示LOGO
MOV AH,9
INT 21H
MAIN: LEA DX,MES1 ;输入NUM1
MOV NUM1,0
MOV BP,1
LEA SI,NUM1
CALL INCHR
LEA DX,MES2 ;输入OPAT
MOV AH,9
INT 21H
CMP BP,2 ;在NUM1中以符号结束
JE IN_A1 ;跳过输入符号
INOT: MOV AH,8
INT 21H
CMP AL,2AH
JE IN_A
CMP AL,2BH
JE IN_A
CMP AL,2DH
JE IN_A
CMP AL,2FH
JE IN_A
JMP INOT
IN_A: MOV OPAT,AL ;有 *+-/ 按键
IN_A1: MOV DL,OPAT
MOV AH,2
INT 21H
LEA DX,MES3 ;输入NUM2
MOV NUM2,0
MOV BP,0
LEA SI,NUM2
CALL INCHR
RUMUL: CMP OPAT,2AH ;是否 * 乘法
JNE RUADD
MOV AX,NUM1
MUL NUM2
MOV RESU1,AX
JC RM_1
RM_3: LEA DX,MES4 ;乘积为16位
MOV DI,0
JMP RM_4
RM_1: JO RM_2
JMP RM_3
RM_2: LEA DX,MES9 ;乘积为32位
MOV AH,9
INT 21H
LEA DX,MESA
MOV DI,1
RM_4: MOV AH,9
INT 21H
MOV AX,RESU1
CALL CHDEC
JMP EXOS
RUADD: CMP OPAT,2BH ;是否 + 加法
JNE RUSUB
MOV AX,NUM1
ADD AX,NUM2
MOV RESU1,AX
JC RA_1
LEA DX,MES4 ;最高位无进位
MOV DI,0
JMP RA_2
RA_1: LEA DX,MESB ;最高位有进位
MOV AH,9
INT 21H
LEA DX,MESA
MOV DI,1
RA_2: MOV AH,9
INT 21H
MOV AX,RESU1
CALL CHDEC
JMP EXOS
RUSUB: CMP OPAT,2DH ;是否 - 减法
JNE RUDIV
LEA DX,MES4
MOV AH,9
INT 21H
MOV AX,NUM1
SUB AX,NUM2
MOV RESU1,AX
JC RS_1
JMP RS_2 ;最高位无借位
RS_1: MOV BX,0 ;最高位有借位
SUB BX,AX
MOV RESU1,BX
MOV DL,2DH
MOV AH,2
INT 21H
RS_2: MOV DI,0
MOV AX,RESU1
CALL CHDEC
JMP EXOS
RUDIV: CMP OPAT,2FH ;是否 / 除法
JNE RUERR
MOV DX,0
MOV AX,NUM1
DIV NUM2
MOV RESU1,AX
MOV RESU2,DX
LEA DX,MES4
MOV AH,9
INT 21H
MOV DI,0
MOV AX,RESU1
CALL CHDEC
MOV DL,2EH
MOV AH,2
INT 21H
INT 21H
INT 21H
MOV DI,0
MOV AX,RESU2
CALL CHDEC
JMP EXOS
RUERR: LEA DX,MES6 ;出现未知错误
MOV AH,9
INT 21H
EXOS: LEA DX,MES8 ;是否退出程序
MOV AH,9
INT 21H
MOV AH,8
INT 21H
CMP AL,59H
JE EX_A
CMP AL,79H
JE EX_A
CMP AL,1BH
JE EX_A
JMP MAIN
EX_A: LEA DX,MES7
MOV AH,9
INT 21H
MOV AH,4CH ;返回MS-DOS
INT 21H
START ENDP
INCHR PROC NEAR ;过程,输入16位数字
MOV AH,9
INT 21H
MOV DI,0
INR_2: MOV AH,8
INT 21H
CMP AL,0DH ;Enter
JE INR_1
CMP AL,20H ;Space
JE INR_1
CMP AL,2AH ;*
JE INR_6
CMP AL,2BH ;+
JE INR_6
CMP AL,2DH ;-
JE INR_6
CMP AL,2FH ;/
JE INR_6
CMP AL,30H
JB INR_2
CMP AL,39H
JA INR_2
SUB AL,30H ;AL=30H-39H
CMP DI,0
JNE INR_5
CMP AL,0
JE INR_2
MOV DI,1 ;DI=1 第一个输入不为0
INR_5: MOV BL,AL
MOV AX,[SI]
MOV DX,0AH
MUL DX
JC INR_3 ;JC,JO 乘法是否溢出
INR_4: MOV BH,0
ADD AX,BX
JC INR_2 ;JO 加法是否溢出
MOV [SI],AX
MOV DL,BL
ADD DL,30H
MOV AH,2
INT 21H
JMP INR_2
INR_3: JO INR_2
JMP INR_4
INR_1: MOV AX,[SI] ;[SI]=0 不能跳出
CMP AX,0
JE INR_2
RET
INR_6: MOV OPAT,AL
MOV AX,[SI]
CMP AX,0
JE INR_2
CMP BP,0
JE INR_2 ;BP=0 不处理符号
MOV BP,2
RET
INCHR ENDP
CHDEC PROC NEAR ;过程,转为十进制并显示
LEA SI,WQ10
MOV CX,5
CH_1: MOV DX,0
DIV WORD PTR [SI]
MOV BX,DX
CMP DI,0 ;DI=0 判断不为0的数
JNE CH_3
CMP AL,0
JE CH_2
MOV DI,1 ;DI=1 第一个不为0的数
CH_3: MOV DL,AL
ADD DL,30H
MOV AH,2
INT 21H
CH_2: ADD SI,2
MOV AX,BX
LOOP CH_1
CMP DI,0 ;没有不为0的数,输出0
JNE CH_4
MOV DL,30H
MOV AH,2
INT 21H
CH_4: RET
CHDEC ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -