汇编语言课程设计--计算比赛成绩系统_第1页
汇编语言课程设计--计算比赛成绩系统_第2页
汇编语言课程设计--计算比赛成绩系统_第3页
汇编语言课程设计--计算比赛成绩系统_第4页
汇编语言课程设计--计算比赛成绩系统_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

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

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

4、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,即得到去掉最高分和最低分之后的平均分,最后设置光标位置到平均分处。3.2设计思路通过记录键盘,将ASCII码转化为二进制数寸入长度为9的字符串中

7、,此部分使用用循环结构。若输入的两位数的首位,即十位,非0或非1,则提示错误并要求重复输入,若输入的个位数非09中的数,则提示错误并要求重复输入。用冒泡法重排9个数,使得第1和第9个数分别为最大数和最小数,并在屏幕中依次显示出来。然后用循环语句求出9个数中中间的7个数的和,即总得分,若总得分为70分,则直接输出平均分:10.00分。若小于70分则将总得分除以得到的商作为平均分的个位数,输出一个小数点,将余数乘以10再除以7,如此循环3次,后两次不输出小数点,得到精确到小数点后两位的平均的分数,再将平均分输出。最后改变光标位置为平均得分处。3.3 程序设计框图开始输入9个分数按大小重排分数求中间

8、7个数的和总分>=70?YESNO平均分=10.00平均分=总分/7输出平均分改变光标位置结束4.代码实现DATAS SEGMENT RESULT DB 10 DUP(?) STRING1 DB 'Please input integer(0-10) ' NUMBER DB 31H,': ','$' STRING2 DB 0AH,'The ranged scores are:','$' STRING3 DB 'After removing the highest and lowest score, t

9、he 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 SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STAC

10、KSCR PROC NEAR ;设置一个子程序PUSH AXPUSH BXMOV AH,02HMOV DL,0DH;回车INT 21HMOV DL,0AH;换行INT 21HPOP BXPOP AXRETCR ENDPSTART: MOV AX,DATAS MOV DS,AX XOR SI,SI MOV CX,9 MOV AH, 00HMOV AL, 10 ;选择显示方式10H(16色图形)INT 10HMOV AH, 10HMOV AL, 00HMOV BH, 10H ;背景设为绿色(02H也可以,是用DEBUG调试出来的)MOV BL, 0 ;选择0号调色板INT 10HINPUT: LE

11、A DX,STRING1MOV AH,9;9号功能,显示字符串INT 21H;的逻辑地址 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

12、ER;大于10则调到ERMOV RESULTSI,AL;把AL的值存放在RESULTINC SI ;SI自加1INC NUMBERCALL CR;调用子程序LOOP INPUTJMP RANGE_0;转入排序ER: LEA DX,ERROR;取ERROR的偏移地址 MOV AH,9 INT 21H JMP INPUTER1: LEA DX,ERROR1 MOV AH,9 INT 21H JMP INPUTRANGE_0:MOV BX,1MOV CX,9XOR DI,DIRANGE:MOV AL,RESULTDI;把RESULT(I)送到ALCMP AL,RESULTDI+1;进行比较JAE N

13、EXT_1;大于或等于跳到NEXT_1XCHG RESULTDI+1,AL;小于则进行交换MOV RESULTDI,AL;保存较大的数MOV BX,0NEXT_1:INC DILOOP RANGECMP BX,0JE RANGE_0 LEA DX,STRING2;取STRING2的偏移地址 MOV AH,9 INT 21H MOV CX,9;显示输出的次数 XOR SI,SI;SI;清零 MOV AH,2RANGE_OUTPUT:;输出排序后的得分 MOV DL,RESULTSI ADD DL,30H;把DL的值转换成ASCII CMP DL,39H;判断是否是10分 JA TENS_1;10

14、分就跳到TEXT_1 JBE TENS_0;不是就跳到TEXT_0TENS_1: MOV BX,1 MOV DL,'1'输出字符1 INT 21H MOV DL,'0'输出字符0 INT 21H INC SI MOV DL,','输出逗号 INT 21H JMP NEXT_2TENS_0:;十位数位0,则按原分输出 INT 21H INC SI MOV DL,',' INT 21HNEXT_2: LOOP RANGE_OUTPUT MOV AH,2 MOV DL,0AH;换行 INT 21H MOV DL,0AH;换行 INT 2

15、1H MOV DL,0DH;回车 INT 21H LEA DX,STRING3;取STRING3的偏移地址MOV AH,9H INT 21H MOV CX,7;累加中间7个数字 XOR AX,AX;AX清零 DEC SISUM:;求7个分数的和DEC SI ADD AL,RESULTSI LOOP 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&#

16、39;输出字符0INT 21HMOV DL,'.'INT 21H;输出字符MOV DL,'0'INT 21HMOV DL,'0'INT 21HJMP ENDINGN_FULL_MARK:;非满分时MOV CX,3;设置循环3次,为下面的求两位小数做准备MOV BH,1;设置小数点出现一次DIVISION: MOV BL,7 DIV BL;除以7 PUSH AX;把除完后的AX入栈,存起来 ADD AL,30H MOV DL,AL MOV AH,2 INT 21H;输出商 CMP BH,0;把BX置为0,使下次循环不会出现小数点 JE DOT MO

17、V DL,'.' INT 21H MOV BX,0DOT: POP AX;恢复之前入栈的余数 MOV AL,AH;余数存入AL MOV DL,10 MUL DL;余数乘以10,结果存入AXLOOP DIVISIONENDING:MOV AH,02;调用2号功能,置光标位置MOV BH,0;显示页MOV DX,0E48H;显示行列,DH=0CH行,DL=48H列INT 10H;设置光标位置MOV AH,4CH INT 21HCODES ENDS END START5调试过程及操作说明如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对如负数,小数点,大于10的都会显示错误的信息然后自动提醒再重新输入。当我们输完数据之后会自动排序和计算成绩6.总结这次课程设计,代码虽然不长,当却可以从中了解很多的知识,比如哪几号的功能是做什么的,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论