2022年汇编语言课程设计方案报告 .docx
精选学习资料 - - - - - - - - - 汇编语言课程实习报告实习题目 运算竞赛成果同学姓名 蔡洁敏班级(学号)计科 1123班 202211621301 院系 信息学院运算机系指导老师 叶晓霞提交时间 2022 年 5 月 28 日成果名师归纳总结 - - - - - - -第 1 页,共 12 页精选学习资料 - - - - - - - - - 目 录名师归纳总结 1 课程实习任务 2 第 2 页,共 12 页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 名评委,每个评委给分范畴为010(整数):由键盘输入;(2) 9 名评委给分中,去掉一个最高分和一个最低分,剩余 7 名评委的平均 分即为参赛者的得分(精确到小数点后二位,不考虑四舍五入);(3) 将最 后得分在光标位置处显示出来;2 基本学问2.1 汇编语言程序结构 汇编语言是运算机能够供应应用户使用的最快而又最有效的语言,也是能 够利用运算机全部硬件特性并能掌握硬件的唯独语言;也因此汇编语言的程序 结构也是多种多样的,我们熟知的结构有循环、分支程序、子程序和宏汇编;而循环程序又有简洁循环和多重循环,最重要的是我们要掌握好循环的次数;分支程序就是由设定条件不同而跳转到不用的分支,来实现不同的功能;子程序就是我们为了把整个程序模块化,使得读程序的人简洁懂得你的程序功能;宏就是一种另类的子程序,是有些程序为了能在时间上达到严格的要求和一些 功能代码简短的多参数传递的程序为了便利参数传递而使用的,而牺牲一点点 空间来实现,当然宏和子程序的工作机制也是不同的;2.2 关键指令分析 2.2.1 数据传送指令 mov 指令: mov 指令可以在 CPU 内或 CPU 和储备器之间传送字或者字节; PUSH 和 POP指令:这两条分别是堆栈的进栈和出栈指令; XCHG 指令:它可以在寄存器之间或者在寄存器和储存器之间交换信息;2.2.2 地址传送指令 LEA 指令:将源操作数的有效地址送到指定的寄存器中;不能使用段寄存名师归纳总结 - - - - - - -第 3 页,共 12 页精选学习资料 - - - - - - - - - 器,源操作数可以使用除立刻数和寄存器外的任一种寄存器寻址方式;2.2.3 类型转换指令 CBW 指令:将 AL 的内容符号扩展到 2.2.4 算数指令AH,形成 AX 中的字 ADD 指令:进行加法操作 INC 指令:自加 1 SUB 指令:进行减法操作 DEC 指令:自减 1 CMP 指令:将两个操作数进行减法操作,但不储存结果,只设置条件标志位MUL 指令:进行无符号乘法操作 DIV 指令:进行无符号除法操作 2.2.5 逻辑指令 AND 指令:进行规律与操作,见0 得 0 OR 指令:进行规律或操作,见1 得 1 XOR 指令:进行异或操作,相同得 JMP指令:无条件跳转到指定位置0,不同得 1 2.2.6 掌握转移指令条件转移指令:依据上一条指令所设置的条件码来判别测试条件,每一种转 移指令有它的测试条件,满意测试条件就转移到指令指定的位置 LOOP 指 令: 当测试条件码 CX 不为 0 时,循环指定程序段 CALL 指令:把子程序的返回地址存入栈中,以便子程序返回主程序时调用 RET 指令:转移到子程序的入口地址去连续执行 2.3 汇编语言上机过程 上机过程是我们编写好程序后验证的最好手段,也是我们对我们写得程序进行调试必不行少的一个过程;上机过程我们第一要把我们编写的程序在编译 器里对它进行编译看看是否有语法上的错误,然后编译生成 .obj 文件,最终连 接生成可执行文件 .exe,然后我们要对生成的可执行文件进行调试,看看是否 有规律上的错误,假如有规律上的错误那么我们仍要对程序进行修改,知道没有规律上的错误时,我们就可以运行程序,并得到我们想要的结果了;上机过程大致课分为四部分:编辑、编译、调试、运行;名师归纳总结 - - - - - - -第 4 页,共 12 页精选学习资料 - - - - - - - - - 只有通过上机过程你才能发觉你的程序是否有规律上或者语法上的错误,最 重要的是检测运行结果是不是你理论上的结果;我们只有在上机过程中才 能发觉问题,然后解决问题,最终得到我们想要的结果;3.总体分析 3.1 程序功能分析通过读取依次从键盘输入的9 个两位的十进制数得分,将得分储存在字符串中,然后用冒泡法将 9 个数的位置按大小重新排列并输出,再将中间的 7 个 数累加起来除以 7,即得到去掉最高分和最低分之后的平均分,最终设置光标 位置到平均分处;3.2 设计思路 ASCII 码转化为二进制数寸入长度为 9 的字符串中,此 通过记录键盘,将 部分使用用循环结构;如输入的两位数的首位,即十位,非 0 或非 1,就提示错误并要求重复输入,如输入的个位数非 输入;09 中的数,就提示错误并要求重复用冒泡法重排 9 个数,使得第 1 和第 9 个数分别为最大数和最小数,并在屏幕中依次显示出来;然后用循环语句求出 9 个数中中间的 7 个数的和,即总得分,如总得分为 70 分,就直接输出平均分:10.00 分;如小于 70 分就将总得分除以得到的商作为平均分的个位数,输出一个小数点,将余数乘以 10 再除以 7,如此循环 3 次,后两次不输出小数点,得到精确到小数点后两位的平均的分数,再将平均分输出;最终转变光标位置为平均得分处;3.3 程序设计框图名师归纳总结 - - - - - - -第 5 页,共 12 页精选学习资料 - - - - - - - - - 开头输入 9 个分数按大小重排分数求中间 7 个数的和总分 >=70. YES NO 平均分 =总分 /7 平均分 =10.00 输出平均分转变光标位置终止名师归纳总结 - - - - - - -第 6 页,共 12 页精选学习资料 - - - - - - - - - 4. 代码实现DATAS SEGMENT RESULT DB 10 DUP. STRING1 DB'Please input integer0-10 ' NUMBER DB 31H,': ','$' STRING2 DB 0AH,'The ranged 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 ENDS STACKS SEGMENT ;此处输入堆栈段代码STACKS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS,SS:STACKS CR PROC NEAR ;设置一个子程序PUSH AX PUSH BX MOV AH,02H MOV DL,0DH ;回车 INT 21H MOV DL,0AH ;换行 INT 21H POP BX POP AX RET CR ENDP START: MOV AX,DATAS MOV DS,AX XOR SI,SI MOV CX,9 MOV AH, 00H MOV AL, 10 ;挑选显示方式 10H16色图形 INT 10H 名师归纳总结 - - - - - - -第 7 页,共 12 页精选学习资料 - - - - - - - - - MOV AH, 10H MOV AL, 00H MOV BH, 10H ;背景设为绿色 02H也可以,是用 DEBUG 调试出来的 MOV BL, 0 ;挑选 0号调色板 INT 10H INPUT: LEA DX,STRING1 MOV AH,9 ;9号功能,显示字符串 INT 21H ;的规律地址 MOV AH,1 ;AL= 输入字符 INT 21H SUB AL,30H ;把输入的字符 ASCII 转换成数值 MOV DL,10 MUL DL ;十位数乘以 10 MOV DX,AX ;把十位数存放在 DL MOV AH,1 INT 21H MOV BL, '.'CMP AL,BL ;判定个位数是否是小数点,由于要输入的数是整数,用这种方 法来提示输入的数不能是小数JE ER1 SUB AL,30H ADD AL,DL ;个位数和十位数相加 CMP AL,0 ;跟 0比较 JB ER ;小于 0就调到 ER CMP AL,10 ;跟 10比较 JA ER ;大于 10就调到 ER MOV RESULTSI,AL ;把 AL的值存放在 RESULT INC SI ;SI自加 1 INC NUMBER CALL CR ;调用子程序 LOOP INPUT JMP RANGE_0 ;转入排序ER: LEA DX,ERROR MOV AH,9 ;取 ERROR的偏移地址 INT 21H JMP INPUT ER1: LEA DX,ERROR1 MOV AH,9 名师归纳总结 - - - - - - -第 8 页,共 12 页精选学习资料 - - - - - - - - - INT 21H JMP INPUT RANGE_0: MOV BX,1 MOV CX,9 XOR DI,DI RANGE: MOV AL,RESULTDI ;把 RESULTI送到AL CMP AL,RESULTDI+1 JAE NEXT_1 XCHG RESULTDI+1,AL MOV RESULTDI,AL ;进行比较;大于或等于跳到 NEXT_1 ;小于就进行交换;储存较大的数MOV BX,0 NEXT_1: INC DI LOOP RANGE CMP BX,0 JE RANGE_0 LEA DX,STRING2 MOV AH,9 INT 21H ;取 STRING2的偏移地址MOV CX,9 ;显示输出的次数 XOR SI,SI;SI ;清零 MOV AH,2 RANGE_OUTPUT: ;输出排序后的得分 MOV DL,RESULTSI ADD DL,30H CMP DL,39H JA TENS_1 JBE TENS_0 ;把 DL的值转换成 ASCII ;判定是否是 10分;10分就跳到 TEXT_1 ;不是就跳到 TEXT_0 TENS_1: MOV BX,1 MOV DL, '1';输出字符 1 INT 21H MOV DL, '0';输出字符 0 INT 21H INC SI MOV DL, ',';输出逗号 INT 21H JMP NEXT_2 TENS_0: ;十位数位 0,就按原分输出 INT 21H INC SI MOV DL, ',' 名师归纳总结 - - - - - - -第 9 页,共 12 页精选学习资料 - - - - - - - - - INT 21H NEXT_2: LOOP RANGE_OUTPUT MOV AH,2 MOV DL,0AH ;换行 INT 21H MOV DL,0AH ;换行 INT 21H MOV DL,0DH ;回车 INT 21H LEA DX,STRING3 MOV AH,9H INT 21H ;取 STRING3的偏移地址MOV CX,7 ;累加中间 7个数字 XOR AX,AX ;AX 清零 DEC SI SUM: ;求 7个分数的和 DEC SI ADD AL,RESULTSI LOOP SUM CMP AL,46H ;与满分 70 比较JAE FULL_MARK JMP N_FULL_MARK FULL_MARK: ;满分时MOV AH,2H MOV DL, '1';输出字符 1 INT 21H MOV DL, '0';输出字符 0 INT 21H MOV DL, '.' ;大于等于挑到 FULL_MARK ;否就跳到 N_FULL_MARK INT 21H ;输出字符 MOV DL, '0' INT 21H MOV DL, '0' INT 21H JMP ENDING N_FULL_MARK: ;非满分时MOV CX,3 ;设置循环 3次,为下面的求两位小数做预备 MOV BH,1 ;设置小数点显现一次 DIVISION: MOV BL,7 名师归纳总结 - - - - - - -第 10 页,共 12 页精选学习资料 - - - - - - - - - DIV BL PUSH AX ;除以 7 ;把除完后的 AX 入栈,存起来ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ;输出商 CMP BH,0 ;把 BX置为 0,使下次循环不会显现小数点 JE DOT MOV DL, '.' INT 21H MOV BX,0 DOT: POP AX MOV AL,AH MOV DL,10 MUL DL ;复原之前入栈的余数;余数存入 AL ;余数乘以 10,结果存入 AX LOOP DIVISION ENDING: MOV AH,02 ;调用 2号功能,置光标位置 MOV BH,0 ;显示页MOV DX,0E48H ;显示行列, DH=0CH行, DL=48H列INT 10H ;设置光标位置 MOV AH,4CH INT 21H CODES ENDS ENDSTART 5 调试过程及操作说明名师归纳总结 - - - - - - -第 11 页,共 12 页精选学习资料 - - - - - - - - - 如上图,当我们输入一个整数的时候会自动跳到下行输入,输入的数不对如负数,小数点,大于10 的都会显示错误的信息然后自动提示再重新输入;当我们输完数据之后会自动排序和运算成果 6. 总结 这次课程设计,代码虽然不长,当却可以从中明白许多的学问,比如哪几 号的功能是做什么的,之前都不是怎么明白,等到要做的时候,一个一个会去 具体查询,然后通过实践明白了这些指令的作用和用处;通过课程几天的课程设计,学到了诸多上课学不到的学问,特殊是体会到 了汇编语言与高级程序语言编程的不同,起初特别不相宜汇编语言的编程,高 级程序语言中的基本功能,入多重循环和套嵌,在汇编语言看来缺是相当复杂的,仍有数字的输入和输出都要经过ASCII 码与二进制的转换,数据的定义少得可怜,这些特性都让起初的我感到寸步难行;但是进过进一步的上机操作和 学习,汇编语言开头变得明朗起来;7 参考文献名师归纳总结 I BM_PC汇编语言程序设计(其次版)沈美明、温冬婵编著第 12 页,共 12 页- - - - - - -