题目:从键盘接收若干个一位十进制数值(0~9),并以十进制数据形式显示其和。
要求:
(1)用子程序实现一位十进制数值的输入;
(2)当用户未输入数值,直接回车时,结束输入;
(3)输出的数据为多位十进制数据,而机器内部计算的和是十六进制
形式,需要进行数制转换,然后以字符串的形式输出结果;
(4)程序中要求有必要的提示信息。
DATA SEGMENT
STR1 DB 0AH,0DH,"Please input a number: $"
STR2 DB 0AH,0DH,"The sum is: $"
NUM DW ? ;保存从键盘输入的数据
SUM DW ? ;保存求和
DATA ENDS
STACK SEGMENT
STACK ENDS
CODE SEGMENT
ASSUME DS:DATA,SS:STACK,CS:CODE
START:
MOV AX,DATA
MOV DS,AX
MOV NUM,0 ;初始化数据
MOV SUM,0
INPUT: ;输入数据提示
LEA DX,STR1
MOV AH,09H
INT 21H
MOV AH,01H ;从键盘输入一个字符,并存入AL寄存器
INT 21H
CMP AL,0DH;判断是否是回车,若是回车,则结束输入
JZ OUTPUT ;数据输入结束,同时也已经计算完成,可以进行输出
CMP AL,30H ;判断是否大于0,如果小于0,则结束程序
JB EXIT
CMP AL,39H ;判断是否小于9,如果大于9,则结束程序
JA EXIT
SUB AL,30H ;将ASCII码转换成对应的十进制数据
MOV AH,0 ;将AH清零
MOV NUM,AX ;保存新数据
JMP CAL
CAL:
MOV AX,NUM ;将NUM中数据给AX
ADD AX,SUM ;进行求和运算
MOV SUM,AX ;把求和结果保存到SUM中
JMP INPUT
S1 PROC ;进行十进制的输出
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AX,SUM
MOV CX,0
CMP AX,0
JZ REV11
MOV BX,10 ;每次除以10,取余,将十六进制数转换成十进制数
D1:
XOR DX,DX ;将DX清零
XOR AX,AX ;将AX清零 ;;这一步可以不要,没啥用
MOV AX,SUM ;把数据送到AX中,进行除法指令
DIV BX ;若进行无符号数的双子或字相除时,所得的商和余数也是无符号数,分别放在AX和DX中
MOV SUM,AX ;将商放在SUM1中
CMP DX,0
JZ D2 ;判断余数是否为0,若为0,则结束
ADD DL,30H ;将十进制转换成对应的ASCII码
MOV DH,0 ;将DH清零
PUSH DX
INC CX
CMP DX,0
JNZ D1 ;判断余数是否为0,若不为0,则继续进行取余运算
D2:
POP DX
DEC CX
MOV AH,02H ;单字符输出
INT 21H
CMP CX,0
JZ REV1
JMP D2
REV11:
MOV DL,30H
MOV AH,02H
INT 21H
REV1:
;MOV DL,44H ;将字符D作为最后的后缀输出
;INT 21H
POP DX
POP CX
POP BX
POP AX
RET
S1 ENDP
OUTPUT:
LEA DX,STR2 ;输出结果提示
MOV AH,09H
INT 21H
CALL S1
EXIT:
MOV AX,4C00H ;程序结束,返回DOS系统
INT 21H
CODE ENDS
END START