汇编语言课程实习报告实习题目计算比赛成绩学生姓名蔡洁敏班级(学号)计科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中的字224算数指令ADD指令:进行加法操作INC指令:自加1 SUB指令:进行减法操作DEC 指令:自减1CMP指令:将两个操作数进行减法操作,但不保存结果,只设置条件标志位MUL指令:进行无符号乘法操作 DIV指令:进行无符号除法操作2.2.5 逻辑指令AND指令:进行逻辑与操作,见 0得0 OR指令:进行逻辑或操作,见1得1XOR指令:进行异或操作,相同得 0,不同得1 2.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程序设计框图开始 输入9 个分数『改变光标位置 结束4.代码实现【MeiWei 81-优质适用文档】 DATAS SEGMENT平均分 =总分 /7平均分 =10.00按大小重排分数输出平均分RESULT DB 10 DUP(?)STRING1 DB 卩 lease in put in teger(O-IO)'NUMBER DB 31H,': ','$'STRING2 DB 0AH, 'The ran ged scores are,!$'STRING3 DB '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 BXMOV AH;02HMOV DL;0DH ;回车INT 21HMOV DL;0AH ;换行INT 21HPOPBXPOPAXRETCR 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 ;的逻辑地址MOV AH;1 ;AL=输入字符INT 21HSUB AL;30H ;把输入的字符ASCII转换成数值MOV DL,1OMUL 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则调到ER CMP AL,10 ;跟10比较JA ER ;大于10则调到ER MOV RESULT[SI],AL ;把AL 的值存放在 RESULTINC SI;SI 自加 1 INC NUMBERCALL CR;调用子程序 LOOP INPUTJMP RANGE_0;转入排序ER:LEA DX,ERROR MOV AH,9 INT 21H JMPINPUTER1:LEA DX,ERROR1MOV AH,9 INT 21H JMP INPUTRANGE_0:MOV BX,1MOV CX,9XOR DI,DIRANGE:MOV AL,RESULT[DI] CMP AL,RESULT[DI+1] JAE NEXT_1 XCHG RESULT[DI+1],AL MOV RESULT[DI],AL MOV BX,0NEXT_1:INC DILOOP RANGECMP BX,0;取ERROR 的偏移地址;把 RESULT(I)送至 U AL;进行比较 ;大于或等于跳到NEXT_1 ;小于则进行交换 ;保存较大的数JE RANGE_OLEA DX,STRING2 MOV AH,9INT 21H ;取STRING2的偏移地址 MOV CX,9 XOR SI,SI;SI MOV AH,2 RANGE_OUTPUT: MOV DL,RESULT[SI];显示输出的次数 ;清零 ;输出排序后的得分 ADD DL,30H CMP DL,39H JA TENS_1JBE TENS_0 TENS_1: MOV BX,1MOV DL,'1' INT 21H ;把DL 的值转换成ASCII ;判断是否是10分 ;10分就跳到 TEXT_1 ;不是就跳到TEXT_0 ;输出字符1 MOV DL,'0' ;输出字符0 INT 21HINC SIMOV DL,',' INT 21H;输出逗号 JMP NEXT_2TENS_0: INT 21H INC SIMOV DL,',' INT 21H ;十位数位0,则按原分输出NEXT_2: LOOP RANGE_OUTPUTMOV AH,2MOV DL,0AH ;换行 INT 21HMOV DL,0AH ;换行 INT 21H MOV DL,0DH INT 21HLEA DX,STRING3 MOV AH,9H INT 21H ;回车 ;取STRING3的偏移地址 ;累加中间7个数字 ;AX 清零SUM: ;求7个分数的和 DEC SI ADD AL,RESULT[SI] LOOP SUM MOV CX,7 XOR AX,AX DEC SICMP AL,46H ;与满分70比较JAE FULL_MARK ;大于等于挑到FULL_MARKJMP N_FULL_MARK ;否贝U跳至U N_FULL_MARK FULL_MARK:;满分时MOV AH,2HMOV DL,'1' ;输出字符1INT 21HMOV DL,'0' ;输出字符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,7DIV BL ;除以7PUSH AX ;把除完后的AX入栈,存起来ADD AL,30HMOV DL,ALMOV AH,2INT 21H ;输出商CMP BH,0 ;把BX置为0,使下次循环不会出现小数点JE DOTMOV DL,'.'INT 21HMOV BX,0DOT:POPAXMOV AL,AHMOV DL,10MUL DLLOOP DIVISION ENDING:MOV AH,02MOV BH,0MOV DX,0E48H;恢复之前入栈的余数;余数乘以10,结果存入AX;调用2号功能,置光标位置;显示页;显示行列,DH=0CH行,DL=48H列;设置光标位置5调试过程及操作说明MOV AH,4CHINT 21HCODES ENDS END START nput npu t npu t integer (0-10) integer(G-10) integer (G-W) integer(O-lG) integer(0-10) integer(G-10) integer (0-1G) integer(G-10) integer (G-10) integer(G-lO) integer (0^10) integer (0-10)out of range □ut of range is not an integer PleaseFleasePleasePleasePleasePleasePleasePleasePleasePleasePleasePlease Press any key to continuefitter remouing the highest and lowest scorej tlie average score is: 6.71The ranged scores are:9*8P 8F B,0j?P b*Zjlj3000 cycles, Frames kip 0, Program: DWTEL/1P 1ZZ2Z34567BQJ DOSB PK 0.74, Cpu speed:如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对如负数,小数点,大于10的都会显示错误的信息然后自动提醒再重新输入。