📄 count.asm
字号:
;一个多位数加,减,乘,除计算器的汇编程序(只能是非负数)
STACK SEGMENT
DW 64 DUP(?)
STACK ENDS
CLEAR MACRO COLOR ;清屏
MOV AH,6 ;屏幕初始化
MOV AL,0 ;页号
MOV CH,0 ;设置左上角的坐标为(0,0)
MOV CL,0
MOV DL,100 ;设置右上角的坐标为(100,100)
MOV DH,100
MOV BH,COLOR ;卷入行属性
INT 10H ;BIOS调用
ENDM
DATA SEGMENT
STR1 DB ' ****** C O U N T ****** ',0DH,0AH,0DH,0AH,
'** Form Of Input: A + - * / B (Only for plus)',0DH,0AH,
'** Then Press Enter To Get The Result.',0DH,0AH,
'** Input Q/q To Quit!',0DH,0AH,0DH,0AH,
'Please Input: ','$'
;输入格式为: 输入一个数A(0<=A<65535) 再直接输入+-*/其中一个符号
;再直接输入一个数B(<65535) 按回车即可得到结果
STR2 DB 0DH,0AH,'Input error,please input again:','$'
STR3 DB ' remainder=$' ;remainder:指余数
STR4 DB ' RESULT=$'
AB DB 12 DUP(?) ;存放输入的值
A DW 0 ;第一个输入数
B DW 0 ;第二个输入数
X DB 15 DUP(?)
C0 DB 14 DUP(?)
C1 DW 0
D DB ?
S DB 0 ;存放+ - * /符号
COUNTA DW ?
COUNTB DW ?
H DW 0 ;存放减法,乘法,除法结果的低位(AX)
L DW 0 ;存放减法,乘法,除法结果的高位(DX)
DATA ENDS
CODE SEGMENT
MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
PUSH DX
SUB AX,AX
PUSH AX
MOV AX,DATA
MOV DS,AX
BACK: CLEAR 1BH ;界面显示颜色
LEA DX,STR1 ;输出字符界面
MOV AH,9
INT 21H
SL:
MOV DL,0DH ;回车换行
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
MOV S,0
MOV C1,0
LEA SI,AB
MOV AH,1
INT 21H
MOV [SI],AL
MOV D,AL ;输入的数放在D里
CMP D,'Q'
JZ Q
CMP D,'q'
JZ Q
CMP D,30H
JB ERO ;如果输入的不是数字范围就提示输入错误
CMP D,39H
JA ERO
MOV BX,0
LOOP1:
INC BX
MOV AH,1
INT 21H
MOV [SI+BX],AL
MOV D,AL ;输入的第二个字节,它是+ - * / 等符号
CMP D,'Q'
JZ Q
CMP D,'q'
JZ Q
CMP D,'+'
JZ A1
CMP D,'-'
JZ A1
CMP D,'*'
JZ A1
CMP D,'/'
JZ A1
CMP D,'='
JZ A2
CMP D,0dh ;按回车就可以得到答案
JZ A3
CMP D,30H
JB ERO
CMP D,39H
JA ERO
JMP LOOP1 ;当输入了第四个字节时如它不为=号或回车时,它就会出错了,因为循环到A1时S已经判断不为0了
Q: JMP QUIT
ERO: LEA DX,STR2 ;输入有误,输入的不是数字
MOV AH,9
INT 21H
JMP SL
A1: CMP S,0 ;如第四个输入数还跳到这里就会出错,S已经不为0了
JNZ ERO
DEC BX
MOV COUNTA,BX
MOV AL,D
MOV S,AL ;第二个字节即符号放在S里面
JMP LOOP1
A2: CMP S,0 ;如果第二个字节输入=号提示错误
JZ ERO
DEC BX
MOV COUNTB,BX
CALL ASC_BIN
CMP S,'+'
JZ P1
CMP S,'-'
JZ P2
CMP S,'*'
JZ P3
CMP S,'/'
JZ P4
A3:
MOV DL,0DH
MOV AH,2
INT 21H
MOV DL,0AH
MOV AH,2
INT 21H
LEA DX,STR4
MOV AH,9
INT 21H
JMP A2
P1: CALL ADD1 ;调用加法
JMP SL
P2: CALL SUB2 ;调用减法
JMP SL
P3: CALL MUL3 ;调用乘法
JMP SL
P4: CALL DIV4 ;调用除法
JMP SL
ADD1 PROC ;加法
MOV DX,0
MOV AX,A
ADD AX,B
ADC DX,0
MOV L,AX
MOV H,DX
CALL XS
RET
ADD1 ENDP
SUB2 PROC ;减法
MOV AX,A
CMP AX,B
JA CNT
CMP AX,B
JZ CNT
MOV BX,B
MOV A,BX
MOV B,AX
MOV DL,'-'
MOV AH,2
INT 21H
CNT:MOV AX,A
SUB AX,B
MOV DX,0
MOV L,AX
MOV H,0
CALL XS
RET
SUB2 ENDP
MUL3 PROC ;乘法
MOV DX,0
MOV AX,A
MUL B
MOV L,AX
MOV H,DX
CALL XS
RET
MUL3 ENDP
DIV4 PROC ;除法
MOV DX,0
MOV AX,A
DIV B
PUSH DX
MOV H,0
MOV L,AX
CALL XS
LEA DX,STR3
MOV AH,9
INT 21H
mov c1,0
POP DX
MOV H,0
MOV L,DX
CALL XS
RET
DIV4 ENDP
ASC_BIN PROC ;把第一、第二个数分别给A和B
INC COUNTA
MOV CX,COUNTA
MOV AX,0
MOV BX,10
LEA SI,AB
LOOP01: MOV DL,[SI]
AND DL,0FH
MOV [SI],DL
MUL BX
MOV DL,[SI]
MOV DH,0
ADD AX,DX
INC SI
LOOP LOOP01
MOV DX,SI
LEA SI,AB
SUB DX,SI
MOV SI,DX
CMP SI,COUNTA
JNZ LOOP02
MOV A,AX
MOV AX,COUNTB
DEC COUNTA
SUB AX,COUNTA
MOV CX,AX
LEA SI,AB
INC COUNTA
ADD SI,COUNTA
MOV AX,0
JMP LOOP01
LOOP02: MOV B,AX
RET
ASC_BIN ENDP
BIN_ASC PROC ;把结果转换成十进制
MOV BX,10
LEA DI,C0
LP1: MOV DX,0
MOV AX,H
CMP AX,0
JZ LP2
DIV BX
MOV H,AX
MOV AX,L
DIV BX
MOV L,AX
OR DL,30H
MOV [DI],DL
INC DI
INC C1
JMP LP1
LP2: MOV AX,L
LP3: CMP AX,0
JZ LP4
MOV DX,0
DIV BX
OR DL,30H
MOV [DI],DL
INC DI
INC C1
JMP LP3
LP4: CMP C1,0
JNZ LP5
MOV AL,30H
MOV [DI],AL
INC C1
LP5: RET
BIN_ASC ENDP
XS PROC
CALL BIN_ASC ;把结果转换成十进制
CALL SC ;然后打印出来
RET
XS ENDP
SC PROC ;打印结果
MOV CX,C1
DEC C1
LEA SI,C0
ADD SI,C1
LEA DI,X
LP:MOV AL,[SI]
MOV [DI],AL
DEC SI
INC DI
LOOP LP
MOV AL,'$'
MOV [DI],AL
LEA DX,X
MOV AH,9
INT 21H
RET
SC ENDP
QUIT: ;退出
MOV AH,4CH
INT 21H
MAIN ENDP
CODE ENDS
END START
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -