大连理工大学物理光电工程学院 汇编作业
题目:计算10个0~9之间数字的总和、平均值并统计大于6的数字的个数。
要求:
(1)屏幕显示程序功能-欢迎界面;
(2)键盘输入具体数值,限制输入范围在0~9之间;
(3)屏幕显示计算结果;
(4)控制程序的循环与退出方式;
////////////////////////////////////////////////////////////////////////////////////////////////////
//作者申明:本程序为原创作品,经测试能正常使用,欢迎转载学习,如有转载,请注明出处,另外,作品解释//
// 权归作者所有,未经授权不得做任何商业用途。 //
// //
//Author:刘璟(liujing) //
//Adress:大连理工大学物理光电工程学院0603班 //
//E-mail:liu_jing07@163.com //
//TEL: 15840613607 //
////////////////////////////////////////////////////////////////////////////////////////////////////
//设置数据段,取名为DATA
DATA SEGMENT
weltouse DB 0DH,0AH,'welcome to this simple testing system!$'
intro DB 0DH,0AH,'if you want to quit, press Q OR q.',0DH,0AH,'$'
intro2 DB 0DH,0AH,'please input 10 integers IN the range of 0 to 9, REMEMBER IT !!!$'
err DB 0DH,0AH,'error,out of range, please retry!$'
num DB 0DH,0AH,'NO.$'
sum DB 0DH,0AH,'the sum is: $'
ave DB 0DH,0AH,'the average is: $'
passed DB 0DH,0AH,'the numbers passed are: $'
allpass DB 0DH,0AH,'all numbers passed $'
tryagain DB 0DH,0AH,'welcome to try again $'
sure DB 0DH,0AH,'are you sure to exit?(Y/N)$'
exit DB 0DH,0AH,'thanks for using, press anykey to exit...$'
DATA ENDS
//代码段
CODE SEGMENT
ASSUME CS: CODE, DS: DATA
//getchar、display1、display2、displaychar、为宏定义
getchar MACRO //从键盘上获取一个字符并回显
MOV AH, 01H
INT 21H
ENDM
display1 MACRO string //显示DATA段中的字符串
LEA DX, string
MOV AH, 09H
INT 21H
ENDM
display2 MACRO //显示No._>
display1 num
MOV DX, SI
MOV AH, 02H
INT 21H
MOV DL, '>'
MOV AH, 02H
INT 21H
ENDM
displaychar MACRO //显示缓冲区DL中的字符
MOV AH, 02H
INT 21H
ENDM
//以下为主程序,以START开头,其中EXIT1、QUIT、ERROR是标号而不是子函数名称
EXIT1: display1 exit
getchar
MOV AX, 4CH
INT 21H
QUIT: display1 sure
getchar
CMP AL, 'N'
JZ INPUT
CMP AL, 'Y'
JZ EXIT1
JMP QUIT //QUIT-->EXIT1——判断是否退出
ERROR: display1 err //ERROR——输入不合法,返回INPUT重新输入
JMP INPUT
START: MOV AX, DATA
MOV DS, AX //取数据段地址送DS,程序开头都有的代码
display1 weltouse //显示“Welcome to ...”欢迎界面
display1 intro
INITIAL: display1 intro2 //显示“please input...”,初始化CX、BX、BP、SI
MOV CX, 10 //CX装十次循环量,loop每循环一次CX减一
MOV BX, 0 //BX装总和,初始值为0
MOV BP, '0' //BP装大于6的个数
MOV SI, '0' //SI装当前数的序号(No._>)
///////////////////////////////////////////////////////////////////////////////////////////////
//以下为重点:输入字符、判断是否退出、判断是否合法、求和、求平均值、并统计大于6的个数,由两大//
//循环构成:一重是INPUT-->LOOP INPUT,作用是输入十次数据,并求和;二是JMP INITIAL-->INITIAL //
//造成死循环,以便不断输入数据,退出只有一个办法,就是通过上面的QUIT-->EXIT1退出。 //
///////////////////////////////////////////////////////////////////////////////////////////////
INPUT: display2 //显示“No. >”
getchar //输入字符
CMP AL, 'Q'
JZ QUIT
CMP AL, 'q'
JZ QUIT //判断是否为“Q”或“q”,是则跳到QUIT,不是则继续往下执行
CMP AL, '9'
JA ERROR
CMP AL, '0'
JB ERROR //判断是否大于“9”或小于“0”,是则显示“error,...” 并返回INPUT重新输入
CMP AL, '6'
JBE SIXS //判断是否小于6,是则跳过"INC BP"执行"SIXS..."行,SI+1-->SI,否则BP+1-->BP,表示大于6的数又多了一个
INC BP
SIXS: INC SI
SUB AL, 30H //求和,把每次输入+BL-->BL,十次下来就是总和
ADD BL, AL
LOOP INPUT //循环十次,每次CX减一
MOV BH,0 //把总和先除以10得到余和商,余数-->AH,商-->AL,再把AX-->BX,得到装总和的BX
MOV AX,BX //注意:因为是除以10,所以先做除法可以一举两得,所以得到的结果既是“X.X”的形式,又可以表示总和“XX”
MOV BL,10
DIV BL
MOV BX,AX //BX中BH为余数,BL为商
ADD BL,30H //除以10后BX中装的不是ASCII码,要转化成ASCII码需要分别将BH、BL加上30H(30H在ASCII码中表示'0')
ADD BH,30H
display1 sum
MOV DL, BL //显示总和,先显示低八位,得总和的十位,再显示高八位,得总和的个位
displaychar
MOV DL, BH
displaychar
display1 ave //显示平均值,同上方法类似,用中间再上“.”表示小数
MOV DL, BL
displaychar
MOV DL, '.'
displaychar
MOV DL, BH
displaychar
MOV CX, BP //先把BP装入CX,否则后续的几行程序会改变BP的值,再显示大于6的个数时就会出错
CMP BP, ':' //判断所有的输入是否全大于6,是则显示“all passed”,否则显示“the numbers passed...”的字符串
JE ALLPASSED //并显示大于6的个数(这时是把CX-->DX,也可把CL-->DL)
display1 passed
MOV DX, CX
displaychar
JMP OVER //分支结构,每个分支都转到OVER标号
ALLPASSED: display1 allpass
JMP OVER
OVER: display1 tryagain //显示后欢迎界面“...use again”并返回初始化状态,下一个大循环开始
display1 intro
JMP INITIAL
CODE ENDS //代码段结束标志
END START //主程序结束标志