收藏 分享(赏)

汇编语言课程设计报告.doc

上传人:tangtianxu2 文档编号:2882649 上传时间:2018-09-29 格式:DOC 页数:12 大小:189.50KB
下载 相关 举报
汇编语言课程设计报告.doc_第1页
第1页 / 共12页
汇编语言课程设计报告.doc_第2页
第2页 / 共12页
汇编语言课程设计报告.doc_第3页
第3页 / 共12页
汇编语言课程设计报告.doc_第4页
第4页 / 共12页
汇编语言课程设计报告.doc_第5页
第5页 / 共12页
点击查看更多>>
资源描述

1、 汇 编 语 言 课 程 实 习 报 告实习题目 计算比赛成绩学生姓名 蔡洁敏班级(学号) 计科 1123 班 201211621301院系 信息学院计算机系指导老师 叶晓霞 提交时间 2014 年 5 月 28 日成绩目 录 1 课程实习任务22 基本知识2 2.1 汇编语言程序结构3 2.2 关键指令分析4 2.3 汇编语言上机过程43 总体分析5 3.1 程序功能分析5 3.2 设计思路53.3 程序框图64 代码实现75 调试过程及操作说明116 总结12 7 参考文献121 课程实习任务 计算比赛成绩系统 基本功能: (1) 有 9 名评委,每个评委给分范围为 010(整数):由键盘

2、输入; (2) 9 名评委给分中,去掉一个最高分和一个最低分,剩余 7 名评委的平均分即为参赛者的得分(精确到小数点后二位,不考虑四舍五入) ; (3) 将最后得分在光标位置处显示出来。 2 基本知识 2.1 汇编语言程序结构 汇编语言是计算机能够提供给用户使用的最快而又最有效的语言,也是能够利用计算机所有硬件特性并能控制硬件的唯一语言。也因此汇编语言的程序结构也是多种多样的,我们熟知的结构有循环、分支程序、子程序和宏汇编。而循环程序又有简单循环和多重循环,最重要的是我们要控制好循环的次数;分支程序则是由设定条件不同而跳转到不用的分支,来实现不同的功能;子程序则是我们为了把整个程序模块化,使得

3、读程序的人容易理解你的程序功能;宏则是一种另类的子程序,是有些程序为了能在时间上达到严格的要求和一些功能代码简短的多参数传递的程序为了方便参数传递而使用的,而牺牲一点点空间来实现,当然宏和子程序的工作机制也是不同的。 2.2 关键指令分析 2.2.1 数据传送指令 mov 指令:mov 指令可以在 CPU 内或 CPU 和存储器之间传送字或者字节。PUSH 和 POP 指令:这两条分别是堆栈的进栈和出栈指令。 XCHG 指令:它可以在寄存器之间或者在寄存器和储存器之间交换信息。 2.2.2 地址传送指令 LEA 指令:将源操作数的有效地址送到指定的寄存器中。不能使用段寄存 器,源操作数可以使用

4、除立即数和寄存器外的任一种寄存器寻址方式。 2.2.3 类型转换指令 CBW 指令:将 AL 的内容符号扩展到 AH,形成 AX 中的字 2.2.4 算数指令 ADD 指令:进行加法操作 INC 指令:自加 1 SUB 指令:进行减法操作 DEC 指令:自减 1 CMP 指令:将两个操作数进行减法操作,但不保存结果,只设置条件标志位 MUL 指令:进行无符号乘法操作 DIV 指令:进行无符号除法操作 2.2.5 逻辑指令 AND 指令:进行逻辑与操作,见 0 得 0 OR 指令:进行逻辑或操作,见 1得 1 XOR 指令:进行异或操作,相同得 0,不同得 1 2.2.6 控制转移指令 JMP

5、指令:无条件跳转到指定位置 条件转移指令:根据上一条指令所设置的条件码来判别测试条件,每一种转 移指令有它的测试条件,满足测试条件则转移到指令指定的位置 LOOP 指令: 当测试条件码 CX 不为 0 时,循环指定程序段 CALL 指令:把子程序的返回地址存入栈中,以便子程序返回主程序时调用 RET 指令:转移到子程序的入口地址去继续执行 2.3 汇编语言上机过程 上机过程是我们编写好程序后验证的最好手段,也是我们对我们写得程序进行调试必不可少的一个过程。上机过程我们首先要把我们编写的程序在编译器里对它进行编译看看是否有语法上的错误,然后编译生成.obj 文件,最后连接生成可执行文件.exe,

6、然后我们要对生成的可执行文件进行调试,看看是否有逻辑上的错误,如果有逻辑上的错误那么我们还要对程序进行修改,知道没有逻辑上的错误时,我们就可以运行程序,并得到我们想要的结果了。上机过程大概课分为四部分:编辑、编译、调试、运行。只有通过上机过程你才能发现你的程序是否有逻辑上或者语法上的错误,最重要的是检测运行结果是不是你理论上的结果。我们只有在上机过程中才能发现问题,然后解决问题,最终得到我们想要的结果。3.总体分析 3.1 程序功能分析通过读取依次从键盘输入的 9 个两位的十进制数得分,将得分保存在字符串中,然后用冒泡法将 9 个数的位置按大小重新排列并输出,再将中间的 7 个数累加起来除以

7、7,即得到去掉最高分和最低分之后的平均分,最后设置光标位置到平均分处。3.2 设计思路通过记录键盘,将 ASCII 码转化为二进制数寸入长度为 9 的字符串中,此部分使用用循环结构。若输入的两位数的首位,即十位,非 0 或非 1,则提示错误并要求重复输入,若输入的个位数非 09 中的数,则提示错误并要求重复输入。用冒泡法重排 9 个数,使得第 1 和第 9 个数分别为最大数和最小数,并在屏幕中依次显示出来。然后用循环语句求出 9 个数中中间的 7 个数的和,即总得分,若总得分为 70 分,则直接输出平均分:10.00 分。若小于 70 分则将总得分除以 得到的商作为平均分的个位数,输出一个小数

8、点,将余数乘以 10再除以 7,如此循环 3 次,后两次不输出小数点,得到精确到小数点后两位的平均的分数,再将平均分输出。最后改变光标位置为平均得分处。3.3 程序设计框图YESNO开始输入 9 个分数按大小重排分数求中间 7 个数的和总分=70?平均分=10.00平均分 =总分/7输出平均分改变光标位置结束4.代码实现DATAS SEGMENTRESULT DB 10 DUP(?) STRING1 DB Please input integer(0-10) NUMBER DB 31H,: ,$STRING2 DB 0AH,The ranged scores are:,$STRING3 DB

9、After removing the highest and lowest score, the average score is: ,$ERROR DB out of range,0AH,0DH,$ERROR1 DB is not an integer,0AH,0DH,$ERROR2 DB is not an number,0AH,0DH,$DATAS ENDSSTACKS SEGMENT;此处输入堆栈段代码STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKSCR PROC NEAR ;设置一个子程序PUSH AXPUSH BX

10、MOV AH,02HMOV DL,0DH ;回车INT 21HMOV DL,0AH ;换行INT 21HPOP BXPOP AXRETCR ENDPSTART:MOV AX,DATASMOV DS,AXXOR SI,SIMOV CX,9MOV AH, 00HMOV AL, 10 ;选择显示方式10H(16色图形)INT 10HMOV AH, 10HMOV AL, 00HMOV BH, 10H ;背景设为绿色(02H也可以,是用 DEBUG调试出来的)MOV BL, 0 ;选择0号调色板INT 10HINPUT:LEA DX,STRING1MOV AH,9 ;9号功能,显示字符串INT 21H

11、;的逻辑地址 MOV AH,1 ;AL=输入字符INT 21HSUB AL,30H ;把输入的字符ASCII转换成数值MOV DL,10MUL DL ;十位数乘以10MOV DX,AX ;把十位数存放在DLMOV AH,1INT 21HMOV BL,.CMP AL,BL;判断个位数是否是小数点,因为要输入的数是整数,用这种方法来提示输入的数不能是小数JE ER1SUB AL,30HADD AL,DL ;个位数和十位数相加CMP AL,0 ;跟0比较JB ER ;小于0则调到ERCMP AL,10 ;跟10比较JA ER ;大于10则调到ERMOV RESULTSI,AL ;把AL的值存放在RE

12、SULTINC SI ;SI自加1INC NUMBERCALL CR ;调用子程序LOOP INPUTJMP RANGE_0 ;转入排序ER:LEA DX,ERROR ;取ERROR的偏移地址MOV AH,9INT 21HJMP INPUTER1:LEA DX,ERROR1MOV AH,9INT 21HJMP INPUTRANGE_0:MOV BX,1MOV CX,9XOR DI,DIRANGE:MOV AL,RESULTDI ;把RESULT(I)送到ALCMP AL,RESULTDI+1 ;进行比较JAE NEXT_1 ;大于或等于跳到NEXT_1XCHG RESULTDI+1,AL ;小

13、于则进行交换MOV RESULTDI,AL ;保存较大的数MOV BX,0NEXT_1:INC DILOOP RANGECMP BX,0JE RANGE_0LEA DX,STRING2 ;取STRING2的偏移地址MOV AH,9INT 21HMOV CX,9 ;显示输出的次数XOR SI,SI;SI ;清零MOV AH,2RANGE_OUTPUT: ;输出排序后的得分MOV DL,RESULTSIADD DL,30H ;把DL的值转换成ASCIICMP DL,39H ;判断是否是10分JA TENS_1 ;10分就跳到TEXT_1JBE TENS_0 ;不是就跳到TEXT_0TENS_1:

14、MOV BX,1MOV DL,1 ;输出字符1INT 21HMOV DL,0 ;输出字符0INT 21HINC SIMOV DL, ;输出逗号INT 21HJMP NEXT_2TENS_0: ;十位数位0,则按原分输出INT 21HINC SIMOV DL,INT 21HNEXT_2:LOOP RANGE_OUTPUTMOV AH,2MOV DL,0AH ;换行INT 21HMOV DL,0AH ;换行INT 21HMOV DL,0DH ;回车INT 21HLEA DX,STRING3 ;取STRING3的偏移地址MOV AH,9HINT 21HMOV CX,7 ;累加中间7个数字XOR AX

15、,AX ;AX清零DEC SISUM:;求7个分数的和DEC SIADD AL,RESULTSILOOP SUMCMP AL,46H ;与满分70 比较JAE FULL_MARK ;大于等于挑到FULL_MARKJMP N_FULL_MARK ;否则跳到N_FULL_MARKFULL_MARK:;满分时MOV AH,2HMOV DL,1 ;输出字符1INT 21HMOV DL,0 ;输出字符0INT 21HMOV DL,.INT 21H ;输出字符MOV DL,0INT 21HMOV DL,0INT 21HJMP ENDINGN_FULL_MARK:;非满分时MOV CX,3 ;设置循环3次,

16、为下面的求两位小数做准备MOV BH,1 ;设置小数点出现一次DIVISION:MOV BL,7DIV BL ;除以7PUSH AX ;把除完后的AX入栈,存起来ADD AL,30HMOV DL,AL MOV AH,2INT 21H ;输出商CMP BH,0 ;把BX置为0,使下次循环不会出现小数点JE DOTMOV DL,.INT 21HMOV BX,0DOT: POP AX ;恢复之前入栈的余数MOV AL,AH ;余数存入ALMOV DL,10MUL DL ;余数乘以10,结果存入 AXLOOP DIVISIONENDING:MOV AH,02 ;调用2号功能,置光标位置MOV BH,0

17、 ;显示页MOV DX,0E48H ;显示行列,DH=0CH行,DL=48H列INT 10H ;设置光标位置MOV AH,4CHINT 21HCODES ENDSEND START5 调试过程及操作说明如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对如负数,小数点,大于 10 的都会显示错误的信息然后自动提醒再重新输入。当我们输完数据之后会自动排序和计算成绩6.总结这次课程设计,代码虽然不长,当却可以从中了解很多的知识,比如哪几号的功能是做什么的,之前都不是怎么了解,等到要做的时候,一个一个会去详细查询,然后通过实践了解了这些指令的作用和用处。通过课程几天的课程设计,学到了诸多上课学不到的知识,特别是体会到了汇编语言与高级程序语言编程的不同,起初非常不适宜汇编语言的编程,高级程序语言中的基本功能,入多重循环和套嵌,在汇编语言看来缺是相当复杂的,还有数字的输入和输出都要经过 ASCII 码与二进制的转换,数据的定义少得可怜,这些特性都让起初的我感到寸步难行。但是进过进一步的上机操作和学习,汇编语言开始变得明朗起来。7 参考文献IBM_PC 汇编语言程序设计(第二版)沈美明、温冬婵 编著

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 高等教育 > 专业基础教材

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报