《2022年汇编语言课程设计方案报告.docx》由会员分享,可在线阅读,更多相关《2022年汇编语言课程设计方案报告.docx(12页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精品学习资源汇编语言课程实习报告实习题目运算竞赛成果同学姓名蔡洁敏班级(学号) 计科 1123班 202111621301院系信息学院运算机系指导老师叶晓霞提交时间2021 年 5 月 28 日成果欢迎下载精品学习资源目录1课程实习任务22 基本学问22.1汇编语言程序结构32.2关键指令分析42.3汇编语言上机过程43总体分析53.1程序功能分析53.2设计思路53.3程序框图64代码实现75调试过程及操作说明116总结127参考文献 12欢迎下载精品学习资源1 课程实习任务运算竞赛成果系统基本功能:(1) 有 9 名评委,每个评委给分范畴为 010(整数):由键盘输入;(2) 9 名评委给
2、分中,去掉一个最高分和一个最低分,剩余7 名评委的平均分即为参赛者的得分(精确到小数点后二位,不考虑四舍五入);( 3) 将最终得分在光标位置处显示出来;欢迎下载精品学习资源2.1 汇编语言程序结构2 基本学问欢迎下载精品学习资源汇编语言是运算机能够供应应用户使用的最快而又最有效的语言,也是能够利用运算机全部硬件特性并能掌握硬件的唯独语言;也因此汇编语言的程序结构也是多种多样的,我们熟知的结构有循环、分支程序、子程序和宏汇编;而循环程序又有简洁循环和多重循环,最重要的是我们要掌握好循环的次数; 分支程序就是由设定条件不同而跳转到不用的分支,来实现不同的功能;子程序就是我们为了把整个程序模块化,
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指令:自减 1CMP 指令:将两个操作数进行减法操作,但不储存结果,只设置条件标志位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 程序设计框图欢迎下载精品学习资源开头输入 9 个分数按大小重排分数求中间 7 个数的和总分 =70.YESNO平均分 =总分 /7平均分 =10.00输出平均分转变光标位置终止欢迎下载精品学习资源4. 代码实现DATAS SEGMENT RESULT DB 10 DUP.STRING1 DB Please input integer0-10 NUMBER DB 31H,: ,$STRING2 DB 0AH, The ranged score
9、s 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
10、;设置一个子程序PUSH AX PUSH BX MOV AH,02HMOV DL,0DH;回车INT 21HMOV DL,0AH;换行INT 21H POP BXPOP AXRET CR ENDP START:MOV AX,DATAS MOV DS,AX XOR SI,SIMOV CX,9 MOV AH, 00HMOV AL, 10 ;挑选显示方式 10H16色图形 INT 10H欢迎下载精品学习资源MOV AH, 10H MOV AL, 00HMOV BH, 10H ;背景设为绿色 02H也可以,是用 DEBUG 调试出来的 MOV BL, 0 ;挑选 0号调色板INT 10H INPUT:
11、LEA DX,STRING1MOV AH,9;9号功能,显示字符串INT 21H;的规律地址MOV AH,1;AL= 输入字符INT 21HSUB AL,30H;把输入的字符 ASCII 转换成数值MOV DL,10MUL DL;十位数乘以 10 MOV DX,AX;把十位数存放在 DL MOV AH,1INT 21H MOV BL, .CMP AL,BL;判定个位数是否是小数点,由于要输入的数是整数,用这种方法来提示输入的数不能是小数JE ER1 SUB AL,30HADD AL,DL;个位数和十位数相加CMP AL,0;跟0比较JB ER;小于 0就调到ER CMP AL,10;跟10比较
12、JA ER;大于 10就调到 ERMOV RESULTSI,AL;把AL的值存放在 RESULT INC SI;SI自加1INC NUMBERCALL CR;调用子程序LOOP INPUTJMP RANGE_0;转入排序ER:LEA DX,ERROR;取ERROR的偏移地址MOV AH,9INT 21H JMP INPUTER1:LEA DX,ERROR1 MOV AH,9欢迎下载精品学习资源INT 21H JMP INPUTRANGE_0:MOV BX,1 MOV CX,9 XOR DI,DI RANGE:MOV AL,RESULTDI;把RESULTI 送到ALCMP AL,RESULTD
13、I+1;进行比较JAE NEXT_1;大于或等于跳到 NEXT_1 XCHG RESULTDI+1,AL ;小于就进行交换MOV RESULTDI,AL;储存较大的数MOV BX,0 NEXT_1: INC DILOOP RANGE CMP 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分J
14、A TENS_1;10分就跳到 TEXT_1 JBE TENS_0;不是就跳到 TEXT_0TENS_1:MOV BX,1MOV DL, 1;输出字符 1 INT 21HMOV DL, 0;输出字符 0 INT 21HINC SIMOV DL, ,;输出逗号INT 21HJMP NEXT_2TENS_0:;十位数位 0,就按原分输出INT 21HINC SI MOV DL, ,欢迎下载精品学习资源INT 21H NEXT_2:LOOP RANGE_OUTPUT MOV AH,2MOV DL,0AH;换行INT 21HMOV DL,0AH;换行INT 21HMOV DL,0DH;回车INT 21
15、HLEA DX,STRING3;取STRING3的偏移地址MOV AH,9HINT 21HMOV CX,7;累加中间 7个数字XOR AX,AX;AX 清零DEC SI SUM:;求7个分数的和DEC SIADD AL,RESULTSI LOOP SUMCMP AL,46H;与满分 70 比较JAE FULL_MARK;大于等于挑到 FULL_MARKJMP N_FULL_MARK;否就跳到 N_FULL_MARK FULL_MARK:;满分时MOVAH,2HMOVDL, 1;输出字符 1INT 21HMOVDL, 0;输出字符 0INT 21HMOVDL, .INT 21H;输出字符MOVD
16、L, 0INT 21HMOVDL, 0INT 21HJMP ENDINGN_FULL_MARK:;非满分时MOV CX,3;设置循环 3次,为下面的求两位小数做预备MOV BH,1;设置小数点显现一次DIVISION:MOV BL,7欢迎下载精品学习资源DIV BL;除以 7PUSH AX;把除完后的 AX 入栈,存起来ADD AL,30HMOV DL,AL MOV AH,2INT 21H;输出商CMP BH,0;把BX置为0,使下次循环不会显现小数点JE DOTMOV DL, .INT 21H MOV BX,0 DOT:POP AX;复原之前入栈的余数MOV AL,AH;余数存入 ALMOV
17、 DL,10MUL DL;余数乘以 10,结果存入 AX LOOP DIVISIONENDING:MOV AH,02;调用 2号功能,置光标位置MOV BH,0;显示页MOV DX,0E48H;显示行列, DH=0CH 行, DL=48H 列INT 10H;设置光标位置MOV AH,4CHINT 21H CODES ENDS ENDSTART5 调试过程及操作说明欢迎下载精品学习资源如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对 如负数,小数点,大于 10 的都会显示错误的信息然后自动提示再重新输入;当我们输完数据之后会自动排序和运算成果6. 总结这次课程设计,代码虽然不长,
18、当却可以从中明白许多的学问,比如哪几号的功能是做什么的,之前都不是怎么明白,等到要做的时候,一个一个会去具体查询,然后通过实践明白了这些指令的作用和用处;通过课程几天的课程设计,学到了诸多上课学不到的学问,特殊是体会到 了汇编语言与高级程序语言编程的不同,起初特别不相宜汇编语言的编程,高 级程序语言中的基本功能,入多重循环和套嵌,在汇编语言看来缺是相当复杂 的,仍有数字的输入和输出都要经过ASCII 码与二进制的转换,数据的定义少得可怜,这些特性都让起初的我感到寸步难行;但是进过进一步的上机操作和 学习,汇编语言开头变得明朗起来;7 参考文献I BM_PC汇编语言程序设计(其次版)沈美明、温冬婵编著欢迎下载