实验目的:
1.掌握比较指令,转移指令,和循环指令的使用方法。
2.进一步掌握调试工具的使用方法。
实验内容:
计算1+2+.....+n=?,其中n通过键盘输入,累加和小于2^16,结果期望如下图:
程序流程图:
程序代码(含解释):
程序要点:
1.接收键盘输入的十进制数,转换为二进制数(存入AX寄存器)的指令序列
2.如何将输入的的数按值在打印结果显示为目标图片
3.将AX存放的二进制数转换为十进制数并显示指令序列
;数据段
DATA SEGMENT
INF1 DB "Please input a number(1-361):$" ;$处截止
INF2 DB "1+2+...+$"
INF3 DB "=$" ;为了实现输出结果设置两个字符串进行连接评凑结果
IBUF DB 7,0,6 DUP(?)
;存放输入的值
;注意IBUF+1为输入数的位数,IBUF+2以后的及存放的值,比如:360 按33H,36H,30H存放
OBUF DB 6 DUP(?) ;输出结果
DATA ENDS
;代码段
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV DX,OFFSET INF1 ;输出INF1字符串,值存入IBUF1中,利用9号功能键
MOV AH,09H
INT 21H
MOV DX,OFFSET IBUF ;在此键入十进制数
MOV AH,0AH
INT 21H
MOV CL,IBUF+1 ;十进制数的位数送给计数器进行循环
MOV CH,0
MOV SI,OFFSET IBUF+2 ;取偏移地址,找到存第一个数值的位置,给SI,若为360,这时[SI]为3
MOV AX,0 ;开始将十进制转为二进制
AGAIN:
MOV DX,10 ;((0*10+a4)*10+...)*10+a0
MUL DX
AND BYTE PTR [SI],0FH ;将相应存储单元中的字符ASCII转换为数字
ADD AL,[SI] ;2条指令的功能为(AX)<=(AX)+数字
ADC AH,0
INC SI ;[SI]指向下一个
LOOP AGAIN ;循环执行,完成(AX)<=(AX)*10+[SI]
MOV CX,AX
MOV AX,0
MOV BX,1
LOOP2:
ADD AX,BX ;这里分析流程图吧
INC BX
LOOP LOOP2
MOV BX,OFFSET OBUF+5 ;开始二进制转为10进制
MOV BYTE PTR [BX],'$'
MOV CX,10 ;作(DX):(AX)/10运算
LOOP1:
MOV DX,0 ;被除数高16位清零
DIV CX
ADD DL,30H ;将10进制数转换为ASCII码
DEC BX
MOV [BX],DL
OR AX,AX
JNZ LOOP1
;判断商是否为0,不为0继续
MOV DL,0AH ;打印回车换行符,利用2号功能键
MOV AH,02H
INT 21H
MOV DX,OFFSET INF2 ;打印INF2字符串
MOV AH,09H
INT 21H
MOV CL,IBUF+1 ;实现将输入的值打印出来,符合格式要求
MOV SI,OFFSET IBUF+2
LOOP3:
MOV DL,[SI] ;逐个字符打印输入的值n
ADC DL,30H
MOV AH,02H
INT 21H
INC SI
DEC CL
JNZ LOOP3
MOV DX,OFFSET INF3 ;打印INF3字符串,凑格式
MOV AH,09H
INT 21H
MOV DX,BX ;显示求和结果转换得到的十进制数
MOV AH,09H
INT 21H
MOV AH,4CH
INT 21H
CODE ENDS
END START
实现结果:
发现输入两位三位数都没有问题