汇编从键盘接受若干个一位十进制数值,并以十进制数据形式显示其和

题目:从键盘接收若干个一位十进制数值(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
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值