9A文汇编语言课程设计报告.docx
- 文档编号:28729119
- 上传时间:2023-07-19
- 格式:DOCX
- 页数:15
- 大小:96.86KB
9A文汇编语言课程设计报告.docx
《9A文汇编语言课程设计报告.docx》由会员分享,可在线阅读,更多相关《9A文汇编语言课程设计报告.docx(15页珍藏版)》请在冰豆网上搜索。
9A文汇编语言课程设计报告
汇编语言课程实习报告
实习题目计算比赛成绩
学生姓名蔡洁敏
班级(学号)计科1123班20KK11621301
院系信息学院计算机系
指导老师叶晓霞
提交时间20KK年5月28日
成绩
1课程实习任务……………………………………………………………………2
2基本知识…………………………………………………………………………2
2.1汇编语言程序结构………………………………………………………3
2.2关键指令分析……………………………………………………………4
2.3汇编语言上机过程………………………………………………………4
3总体分析…………………………………………………………………………5
3.1程序功能分析……………………………………………………………5
3.2设计思路…………………………………………………………………5
3.3程序框图…………………………………………………………………6
4代码实现………………………………………………………………………7
5调试过程及操作说明…………………………………………………………11
6总结……………………………………………………………………………12
7参考文献………………………………………………………………………12
1课程实习任务
计算比赛成绩系统
基本功能:
(1)有9名评委,每个评委给分范围为0~10(整数):
由键盘输入;
(2)9名评委给分中,去掉一个最高分和一个最低分,剩余7名评委的平均分即为参赛者的得分(精确到小数点后二位,不考虑四舍五入);(3)将最后得分在光标位置处显示出来。
2基本知识
2.1汇编语言程序结构
汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能控制硬件的唯一语言。
也因此汇编语言的程序结构也是多种多样的,我们熟知的结构有循环、分支程序、子程序和宏汇编。
而循环程序又有简单循环和多重循环,最重要的是我们要控制好循环的次数;分支程序则是由设定条件不同而跳转到不用的分支,来实现不同的功能;子程序则是我们为了把整个程序模块化,使得读程序的人容易理解你的程序功能;宏则是一种另类的子程序,是有些程序为了能在时间上达到严格的要求和一些功能代码简短的多参数传递的程序为了方便参数传递而使用的,而牺牲一点点空间来实现,当然宏和子程序的工作机制也是不同的。
2.2关键指令分析
2.2.1数据传送指令
mov指令:
mov指令可以在CPU内或CPU和存储器之间传送字或者字节。
PUSH和POP指令:
这两条分别是堆栈的进栈和出栈指令。
XCHG指令:
它可以在寄存器之间或者在寄存器和储存器之间交换信息。
2.2.2地址传送指令
LEA指令:
将源操作数的有效地址送到指定的寄存器中。
不能使用段寄存器,源操作数可以使用除立即数和寄存器外的任一种寄存器寻址方式。
2.2.3类型转换指令
CBW指令:
将AL的内容符号扩展到AH,形成AX中的字
2.2.4算数指令
ADD指令:
进行加法操作INC指令:
自加1SUB指令:
进行减法操作DEC指令:
自减1
CMP指令:
将两个操作数进行减法操作,但不保存结果,只设置条件标志位MUL指令:
进行无符号乘法操作DIV指令:
进行无符号除法操作2.2.5逻辑指令
AND指令:
进行逻辑与操作,见0得0OR指令:
进行逻辑或操作,见1得1
XOR指令:
进行异或操作,相同得0,不同得12.2.6控制转移指令
JMP指令:
无条件跳转到指定位置
条件转移指令:
根据上一条指令所设置的条件码来判别测试条件,每一种转移指令有它的测试条件,满足测试条件则转移到指令指定的位置LOOP指令:
当测试条件码CX不为0时,循环指定程序段
CALL指令:
把子程序的返回地址存入栈中,以便子程序返回主程序时调用RET指令:
转移到子程序的入口地址去继续执行
2.3汇编语言上机过程
上机过程是我们编写好程序后验证的最好手段,也是我们对我们写得程序进行调试必不可少的一个过程。
上机过程我们首先要把我们编写的程序在编译器里对它进行编译看看是否有语法上的错误,然后编译生成.obj文件,最后连接生成可执行文件.exe,然后我们要对生成的可执行文件进行调试,看看是否有逻辑上的错误,如果有逻辑上的错误那么我们还要对程序进行修改,知道没有逻辑上的错误时,我们就可以运行程序,并得到我们想要的结果了。
上机过程大概课分为四部分:
编辑、编译、调试、运行。
只有通过上机过程你才能发现你的程序是否有逻辑上或者语法上的错误,最
重要的是检测运行结果是不是你理论上的结果。
我们只有在上机过程中才能发现问题,然后解决问题,最终得到我们想要的结果。
3.总体分析
3.1程序功能分析
通过读取依次从键盘输入的9个两位的十进制数得分,将得分保存在字符串中,然后用冒泡法将9个数的位置按大小重新排列并输出,再将中间的7个数累加起来除以7,即得到去掉最高分和最低分之后的平均分,最后设置光标位置到平均分处。
3.2设计思路
通过记录键盘,将ASCII码转化为二进制数寸入长度为9的字符串中,此部分使用用循环结构。
若输入的两位数的首位,即十位,非0或非1,则提示错误并要求重复输入,若输入的个位数非0~9中的数,则提示错误并要求重复输入。
用冒泡法重排9个数,使得第1和第9个数分别为最大数和最小数,并在屏幕中依次显示出来。
然后用循环语句求出9个数中中间的7个数的和,即总得分,若总得分为70分,则直接输出平均分:
10.00分。
若小于70分则将总得分除以得到的商作为平均分的个位数,输出一个小数点,将余数乘以10再除以7,如此循环3次,后两次不输出小数点,得到精确到小数点后两位的平均的分数,再将平均分输出。
最后改变光标位置为平均得分处。
3.3程序设计框图
YES
NO
4.代码实现
DATASSEGMENT
RESULTDB10DUP(?
)
STRING1DB'Pleaseinputinteger(0-10)'
NUMBERDB31H,':
','$'
STRING2DB0AH,'Therangedscoresare:
','$'
STRING3DB'Afterremovingthehighestandlowestscore,theaveragescoreis:
','$'
ERRORDB'outofrange',0AH,0DH,'$'
ERROR1DB'isnotaninteger',0AH,0DH,'$'
ERROR2DB'isnotannumber',0AH,0DH,'$'
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
CRPROCNEAR;设置一个子程序
PUSHAX
PUSHBX
MOVAH,02H
MOVDL,0DH;回车
INT21H
MOVDL,0AH;换行
INT21H
POPBX
POPAX
RET
CRENDP
START:
MOVAX,DATAS
MOVDS,AX
XORSI,SI
MOVCX,9
MOVAH,00H
MOVAL,10;选择显示方式10H(16色图形)
INT10H
MOVAH,10H
MOVAL,00H
MOVBH,10H;背景设为绿色(02H也可以,是用DEBUG调试出来的)
MOVBL,0;选择0号调色板
INT10H
INPUT:
LEADX,STRING1
MOVAH,9;9号功能,显示字符串
INT21H;的逻辑地址
MOVAH,1;AL=输入字符
INT21H
SUBAL,30H;把输入的字符ASCII转换成数值
MOVDL,10
MULDL;十位数乘以10
MOVDX,AX;把十位数存放在DL
MOVAH,1
INT21H
MOVBL,'.'
CMPAL,BL;判断个位数是否是小数点,因为要输入的数是整数,用这种方法来提示输入的数不能是小数
JEER1
SUBAL,30H
ADDAL,DL;个位数和十位数相加
CMPAL,0;跟0比较
JBER;小于0则调到ER
CMPAL,10;跟10比较
JAER;大于10则调到ER
MOVRESULT[SI],AL;把AL的值存放在RESULT
INCSI;SI自加1
INCNUMBER
CALLCR;调用子程序
LOOPINPUT
JMPRANGE_0;转入排序
ER:
LEADX,ERROR;取ERROR的偏移地址
MOVAH,9
INT21H
JMPINPUT
ER1:
LEADX,ERROR1
MOVAH,9
INT21H
JMPINPUT
RANGE_0:
MOVBX,1
MOVCX,9
XORDI,DI
RANGE:
MOVAL,RESULT[DI];把RESULT(I)送到AL
CMPAL,RESULT[DI+1];进行比较
JAENEXT_1;大于或等于跳到NEXT_1
XCHGRESULT[DI+1],AL;小于则进行交换
MOVRESULT[DI],AL;保存较大的数
MOVBX,0
NEXT_1:
INCDI
LOOPRANGE
CMPBX,0
JERANGE_0
LEADX,STRING2;取STRING2的偏移地址
MOVAH,9
INT21H
MOVCX,9;显示输出的次数
XORSI,SI;SI;清零
MOVAH,2
RANGE_OUTPUT:
;输出排序后的得分
MOVDL,RESULT[SI]
ADDDL,30H;把DL的值转换成ASCII
CMPDL,39H;判断是否是10分
JATENS_1;10分就跳到TEXT_1
JBETENS_0;不是就跳到TEXT_0
TENS_1:
MOVBX,1
MOVDL,'1';输出字符1
INT21H
MOVDL,'0';输出字符0
INT21H
INCSI
MOVDL,',';输出逗号
INT21H
JMPNEXT_2
TENS_0:
;十位数位0,则按原分输出
INT21H
INCSI
MOVDL,','
INT21H
NEXT_2:
LOOPRANGE_OUTPUT
MOVAH,2
MOVDL,0AH;换行
INT21H
MOVDL,0AH;换行
INT21H
MOVDL,0DH;回车
INT21H
LEADX,STRING3;取STRING3的偏移地址
MOVAH,9H
INT21H
MOVCX,7;累加中间7个数字
XORAX,AX;AX清零
DECSI
SUM:
;求7个分数的和
DECSI
ADDAL,RESULT[SI]
LOOPSUM
CMPAL,46H;与满分70比较
JAEFULL_MARK;大于等于挑到FULL_MARK
JMPN_FULL_MARK;否则跳到N_FULL_MARK
FULL_MARK:
;满分时
MOVAH,2H
MOVDL,'1';输出字符1
INT21H
MOVDL,'0';输出字符0
INT21H
MOVDL,'.'
INT21H;输出字符
MOVDL,'0'
INT21H
MOVDL,'0'
INT21H
JMPENDING
N_FULL_MARK:
;非满分时
MOVCX,3;设置循环3次,为下面的求两位小数做准备
MOVBH,1;设置小数点出现一次
DIVISION:
MOVBL,7
DIVBL;除以7
PUSHAX;把除完后的AX入栈,存起来
ADDAL,30H
MOVDL,AL
MOVAH,2
INT21H;输出商
CMPBH,0;把BX置为0,使下次循环不会出现小数点
JEDOT
MOVDL,'.'
INT21H
MOVBX,0
DOT:
POPAX;恢复之前入栈的余数
MOVAL,AH;余数存入AL
MOVDL,10
MULDL;余数乘以10,结果存入AX
LOOPDIVISION
ENDING:
MOVAH,02;调用2号功能,置光标位置
MOVBH,0;显示页
MOVDX,0E48H;显示行列,DH=0CH行,DL=48H列
INT10H;设置光标位置
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
5调试过程及操作说明
如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对如负数,小数点,大于10的都会显示错误的信息然后自动提醒再重新输入。
当我们输完数据之后会自动排序和计算成绩
6.总结
这次课程设计,代码虽然不长,当却可以从中了解很多的知识,比如哪几号的功能是做什么的,之前都不是怎么了解,等到要做的时候,一个一个会去详细查询,然后通过实践了解了这些指令的作用和用处。
通过课程几天的课程设计,学到了诸多上课学不到的知识,特别是体会到了汇编语言与高级程序语言编程的不同,起初非常不适宜汇编语言的编程,高级程序语言中的基本功能,入多重循环和套嵌,在汇编语言看来缺是相当复杂的,还有数字的输入和输出都要经过ASCII码与二进制的转换,数据的定义少得可怜,这些特性都让起初的我感到寸步难行。
但是进过进一步的上机操作和学习,汇编语言开始变得明朗起来。
7参考文献
IBM_PC汇编语言程序设计(第二版)沈美明、温冬婵编著
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 文汇 语言 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)