您好,欢迎来到六九路网。
搜索
您的当前位置:首页计算成绩比赛系统

计算成绩比赛系统

来源:六九路网


汇编语言课程实习报告

实习题目 计算成绩比赛系统

学生姓名

班级(学号)

院系 信息学院计算机系

指导老师 叶晓霞

提交时间 2013年6月28号 成绩

目 录

目 录

1 实习任务概述 ............................................. 2

2 基本知识 ................................................. 2

2.1 汇编语言源程序结构 ................................. 2

2.2 汇编语言上机过程 ................................... 3

2.3 关键指令介绍 ....................................... 3

3 课题分析 ................................................. 5

3.1 程序功能分析 ........................................ 5

3.2 程序流程图 .......................................... 5

图1 主程序流程图 .................................... 5

图2 INPUT子程序流程图 .............................. 6

图3 FIND子程序流程图 ............................... 7

图4 AVG子程序流程图 ................................ 8

4 代码实现 ................................................. 9

5 调试过程及操作说明 ...................................... 16

实习总结 .................................................. 19

参考文献 .................................................. 19

1

汇编语言课程实习报告

计算成绩比赛系统

1 实习任务概述

设计一个计算比赛成绩的系统,要求完成一下的基本功能: ① 有9名评委,每个评委给分范围为0~10(整数):由键盘输入; ② 9名评委给分中,去掉一个最高分和一个最低分,剩余7名评委的平 均分即为参赛者的得分(精确到小数点后二位,不考虑四舍五入); ③ 将最后得分在光标位置处显示出来。

2 基本知识

2.1 汇编语言源程序结构

DATAS SEGMENT

;此处输入数据段代码 DATAS ENDS

STACKS SEGMENT

;此处输入堆栈段代码 STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS START:

MOV AX,DATAS MOV DS,AX

;此处输入代码段代码 MOV AH,4CH

INT 21H

CODES ENDS END START

2

汇编语言课程实习报告

2.2 汇编语言上机过程

用汇编语言编写的源程序,使之运行必须经过以下几个步骤: ① 用编辑程序建立一个扩展名为.ASM的汇编语言源程序文件;

② 调汇编程序(MASM),对源程序汇编,生成机器码目标文件,扩展名 为.OBJ;

③ 连接(LINK)目标文件,生成可执行文件,扩展名为.EXE; ④ 运行可执行文件;

⑤ 如果程序运行有错,可调用DEBUG 程序对.EXE文件进行调试。

2.3 关键指令介绍

(1)通用数据传送指令MOV

格式:MOV DST,SRC ;可在CPU内部或在CPU与存储器之 间传送数据

说明: ① SRC和DST的操作类型必须明确且一致; ② DST不能是立即数; ③ DST、SRC不能同时为存储器寻址; ④ DST、SRC也不能同时为段寄存器; ⑤ 立即数不能直接送段寄存器,必须通过寄存器如AX送到段寄 存器; ⑥ 指令执行不影响标志位。

(2)PUSH和POP指令

PUSH 格式: PUSH SRC POP 格式: POP DST

说明:

① 8086CPU的入栈和出栈操作都是以字为单位进行的; ② POP 指令不允许使用立即数寻址方式;

③ POP指令的目的数段寄存器时,不允许使用CS寄存器。

3

汇编语言课程实习报告

(3)CALL 子程序调用指令:隐含使用堆栈保存返回地址

指令格式:CALL DST ;其中DST为过程的目标地址(即过程名)。 指令功能:① 把CALL指令的下一条指令地址(称为返回点或断点) 推 入堆栈保存,然后转到目标地址(DST);

② CALL指令可以在 段内、段间调用,寻址方式分为直接 和间接两种。

(4)传送有效地址指令LEA 格式:LEA reg,mem

功能:将源操作数的有效地址EA传送给指定的通用寄存器。 说明:

① 源操作数必须采用存储器寻址方式;

② 目的操作数必须是一个16位或32位通用寄存器,但不能使用 段寄存器;

③ 本指令对标志位无影响。

(5)比较指令CMP

格式:CMP SRC,DST

说明:比较两个数,但不保存结果,只根据结果置条件码。

(6)常用的DOS调用:键盘输入,显示输出 ① 从键盘输入一个字符并回显在屏幕上

MOV AH, 01 ;DOS功能号1:键盘输入并回显 INT 21H ;DOS调用类型21H

② 输出一个字符到屏幕上

MOV DL, ‘A’ ;调用参数: 输出字符=(DL) MOV AH, 02 ; DOS功能号2: 显示一个字符 INT 21H ; DOS调用类型21H

③ 输出字符串显示在屏幕上

MOV DX,OFFSET MESSAGE ;DS:DX=串地址(串必须 以$结束)

MOV AH,9 ;DOS功能号9: 显示字符串 INT 21H

4

汇编语言课程实习报告

3

课题分析

3.1 程序功能分析

通过键盘记录,将分数保留在字符串ARRAY中,然后将9个数进行比较,再把最大数和最小数取出来,并在屏幕上显示,此部分使用了循环结构。

除去最高分和最低分,并用循环语句求出9个数中间的7个数的总和,除以7,得到的商作为平均数的个位数,输出小数点,将余数乘以10再除以7,如此循环3次,后两次不输出小数点,得到精确到小数点后两位的平均分数,再将平均分输出。

最后改变光标位置,在屏幕的中心,以红字黑底表示出来。

3.2 程序流程图

开始

初始化数据段 显示输入提示信息 调用INPUT子程序 调用FIND子程序 调用AVG子程序

结束

图1 主程序流程图

5

汇编语言课程实习报告

开始 初始化(CX=9),SI指向数组ARRAY 用INT 21H的(AH=1)功能输入一个字符到AL 将AL的ASCLL减去30H,得到数字 (AL)小于等于9 和大于等于0 等于1? Y INT 21H的(AH)=7功能输入字符到(AL) N (AL)(AL)-30H (AL)=0 ? 显示“0” (AL)”A” (AL)1 (AL)放入SI指向的ARRAY当前一个字节,回显一个逗号 (SI)加1,(CX)减1 (CX)=0 ? RET

图2 INPUT子程序流程图

6

汇编语言课程实习报告

开始 初始化(CX)=9,SI指向数组ARRAY MAX=0,MIN=’A’ 取BL当前指向ARRAY的一个字节到(BI) MAX大于(BL)? N Y MAX (BL) MIN小于(BL) ? N Y MIN (BL) INC SI LOOP 输出MAX和MIN RET

图3 FIND子程序流程图

7

汇编语言课程实习报告

开始 将ARRAY的9个数字累加到(AL) 从(AL)中减去MAX和MIN AL扩展到AX (AX)除以7,整数放到score,余数放到score+1 INT 10H的0号功能设置屏幕80*25文本模式 显示提示信息 INT 10H的2号功能调整光标 INT 10H的9号功能设置字体颜色 显示score, ’.’和score+1,score+2 RET

图4 AVG子程序流程图

8

汇编语言课程实习报告

4 代码实现

;************************************************************* ;第一部分:主界面显示,操作说明

;第二部分:功能:从键盘输入9个0~10的数字到数组ARRAY ;第三部分:功能:查找最大和最小分数并在屏幕上显示

;第四部分:功能:去掉一个最高分和一个最低分,计算平均值得分,精确两位小数,并在屏幕的以红字黑底显示

;*************************************************************

DATA SEGMENT

ARRAY DB 8 DUP(?) MAX_MIN DB 0,'A' SCORE DB 2 DUP(?)

STR1 DB 0AH,0DH, '================#============================#=================$'

STR2 DB 0AH,0DH, '| |$'

STR3 DB 0AH,0DH, '# Welcome to use the calculation results match system #$' STR4 DB 0AH,0DH, '| |$'

STR5 DB 0AH,0DH, '================#============================#=================$'

STR6 DB 0AH,0DH, '* Please follow the instructions *$'

STR7 DB 0AH,0DH, '** **$'

STR8 DB 0AH,0DH, '*** Keyboard input from the 9 0 ~ 10 figures to the array ***$' STR9 DB 0AH,0DH, '**** ****$'

STR10 DB 0AH,0DH, '***** To find the maximum and minimum score *****$'

STR11 DB 0AH,0DH, '****** ******$'

STR12 DB 0AH,0DH, '******* Calculate the average score and output *******$'

STR13 DB 0AH,0DH, '---------------------------------------------------------------$' STR14 DB 0AH,0DH, '$' STR15 DB 0AH,0DH, '$'

9

汇编语言课程实习报告

MESSAGE DB '# Please enter the nine consecutive Score # (0~10) : $' MESSAGE_MAX DB 0DH,0AH,'# Maximum Score # : $' MESSAGE_MIN DB 0DH,0AH,'# Minimum Score # : $' MESSAGE_AVE DB 0DH,0AH,'# Average Score # : $' DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX

;主界面显示,操作说明 DISP MACRO M LEA DX,M MOV AH,9 INT 21H ENDM

DISP STR1 DISP STR2 DISP STR3 DISP STR4 DISP STR5 DISP STR6 DISP STR7 DISP STR8 DISP STR9 DISP STR10 DISP STR11 DISP STR12 DISP STR13 DISP STR14 DISP STR15

CALL INPUT CALL FIND CALL AVG

MOV AH,1 INT 21H

MOV AX,4C00H INT 21H

;功能:从键盘输入9个0~10的数字到数组ARRAY

10

汇编语言课程实习报告

INPUT PROC NEAR PUSH AX PUSH CX PUSH SI

MOV CX,9 LEA SI,ARRAY

LEA DX,MESSAGE ;显示提示信息

MOV AH,9 INT 21H

REP1: MOV AH,1 INT 21H

SUB AL,30H CMP AL,0 JL REP1 CMP AL,9 JG REP1 CMP AL,1 JE REP2 JMP PUT

;如果是第二次输入,调用int21h的7h功能输入,不用回显出来 REP2: MOV AH,7 INT 21H

SUB AL,30H ;是0吗? CMP AL,0

JE INPUT_A ;输入10,用'A'代替输入

INPUT_1:MOV AL,1 JMP PUT

INPUT_A:MOV AH,2 ;如果判断出来是数字0,就回显一下 MOV DL,'0' INT 21H

MOV AL,41H ;输入10,用'A'代替输入

PUT: MOV [SI],AL MOV DL,2CH

MOV AH,2 INT 21H

INC SI

11

汇编语言课程实习报告

DEC CX CMP CX,0 JNZ REP1

EXIT1:MOV BYTE PTR [SI],'$' POP SI POP CX POP AX RET INPUT ENDP

;功能:查找最大和最小分数并在屏幕上显示 FIND PROC NEAR PUSH BX PUSH CX PUSH SI MOV CX,9 LEA SI,ARRAY

REP2:MOV BL,[SI]

CMP MAX_MIN,BL JG NEXT

MOV MAX_MIN,BL

NEXT:CMP MAX_MIN+1,BL JL NEXT2

MOV MAX_MIN+1,BL

NEXT2:INC SI LOOP REP2

;MAX,MIN

MOV DL,0AH MOV AH,2H INT 21H

LEA DX,MESSAGE_MAX ;显示提示信息

MOV AH,9 INT 21H

MOV DL,MAX_MIN CMP DL,41H JNZ NEXT_0

JMP OUT1_00 ;输出A时,用'1'&'0'代替

12

汇编语言课程实习报告

NEXT_0:ADD DL,30H MOV AH,2 INT 21H

JMP TO_MIN

OUT1_00:MOV AH,2 MOV DL,'1' INT 21H

MOV DL,'0' INT 21H

MOV DL,0AH MOV AH,2H INT 21H

TO_MIN:LEA DX,MESSAGE_MIN

MOV AH,9 INT 21H

MOV DL,MAX_MIN+1 CMP DL,41H JNZ NEXT_N0 JMP OUT1_000

NEXT_N0:ADD DL,30H MOV AH,2 INT 21H

JMP TO_WAIT

OUT1_000:MOV AH,2 MOV DL,'1' INT 21H

MOV DL,'0' INT 21H

TO_WAIT:MOV AH,1 INT 21H

EXIT2:POP SI POP CX POP BX RET

;显示提示信息13

汇编语言课程实习报告

FIND ENDP

;功能:去掉一个最高分和一个最低分,计算平均值得分,精确两位小数,并在屏幕的以红字黑底显示 AVG PROC NEAR PUSH AX PUSH CX PUSH DX PUSH SI

MOV CX,9 LEA SI,ARRAY MOV AL,0

REP3:MOV BL,[SI] ;将9个数都加起来到AX,最后减去MAX score和MIN score CMP BL,41H JE NEXT33 ADD AL,BL JMP NEXT3

NEXT33:ADD AL,10

NEXT3:INC SI LOOP REP3

CMP MAX_MIN,41H JE SUB_10

SUB AL,MAX_MIN JMP SUB_MIN

SUB_10:SUB AL,10

SUB_MIN:CMP MAX_MIN+1,41H JE SUB_N10

SUB AL,MAX_MIN+1 JMP NEXT44

SUB_N10:SUB AL,10

;CBW将AL累加起来的和扩展到AX NEXT44:CBW

MOV BL,7 DIV BL

MOV SCORE,AL ;score存放商 CMP AH,0 ;AH里是余数

JNZ NEXT4 ;余数不为0就再除一次即可

14

汇编语言课程实习报告

MOV SCORE+1,AH JMP PRINT

NEXT4:MOV BL,AH MOV AL,BL CBW

MOV BL,10

MUL BL ; (ax)←(al)*(src) MOV BL,7

DIV BL ;此处又是(al)←(ax)/(src)商,(ah)←(ax)/(src)余数一定是0了 MOV SCORE+1,AL

PRINT:MOV AH,0 MOV AL,3

INT 10H ;重新设置屏幕

LEA DX,MESSAGE_AVE MOV AH,9 INT 21H

MOV AH,2

MOV DX,0B26H

INT 10H ;调整光标位置

MOV AH,9 MOV BH,0

MOV BL,0CH ;(BL)前一个控制背景颜色,后一个控制字体颜色,0为黑,C为红,0CH就是红字黑底 MOV CX,4 INT 10H

MOV DL,SCORE ;average score的整数部分 ADD DL,30H CMP DL,3AH

JNZ NNN2 JMP OUT1_0

OUT1_0:INC CX INT 10H

MOV DL,'1' ;输出'1'&'0' MOV AH,2 INT 21H

MOV DL,'0'

15

汇编语言课程实习报告

INT 21H

JMP XSD

NNN2:MOV AH,2 INT 21H

XSD: MOV DL,'.' ;小数点 MOV AH,2 INT 21H

MOV DL,SCORE+1 ;average score小数部分,只有2位小数 ADD DL,30H MOV AH,2 INT 21H

MOV DL,SCORE+1 ADD DL,30H MOV AH,2 INT 21H

EXIT5:POP SI POP DX POP CX POP AX RET

AVG ENDP CODE ENDS

END START

5 调试过程及操作说明

① 运行程序,显示主界面窗口,有简单介绍和操作说明:

“欢迎使用计算成绩比赛系统; 请根据下面提示操作;

从键盘输入9个0~10的数字都数组array; 找出最大和最小分数; 计算出平均分并输出。”

16

汇编语言课程实习报告

② 随意输入9个数,系统自动找出最大数和最小数,并在屏幕上显示 出来:

17

汇编语言课程实习报告

③ 接着按回车键,可以得到去掉最高分和最低分后,中间7个数的平 均得分(精确到小数点后二位):

④ 按任意键退出窗口。

18

汇编语言课程实习报告

实习总结

经过这段时间的课程设计,学到了很多课堂上没有学到的知识,特别是体会到了汇编语言与高级语言编程的不同,起初以为汇编会比高级程序语言简单,容易学,但是经过了这么长的一段时间,发现汇编其实也不容易,挺复杂的,程序也不是一小段一小段而已,而且,加入了多重循环,嵌套,调用等等,程序就更加复杂了。还有数字的经过ASCLL码与R进制(包括二进制、十六进制等)的转换,总感觉很难,这些障碍都让我寸步难行。但是通过进一步的上机操作和学习,向同学请教,讨论和修改,汇编语言开始变得明朗起来。渐渐的,一个完整并且能达到要求的程序总算做好了,也对汇编有了更进一步的认识。

这次课程设计已经结束了,就我自己而言,对本次课程设计感受很深,在这个过程中,我也曾经因为实践经验的缺乏失落过,也为毫无头绪而烦恼,也曾经为调试的成功实现而手舞足蹈。呵呵,让自己在本次课程设计中感受了一番大起大落,使自己从中明白了,做成功一件事,是需要付出和汗水的。天下无难事只怕有心人,只要自己坚定信念,成功也只在咫尺之间。当然,我们也不能满足于现有的水准,否则就会停滞不前,要知道学海无涯,仍需我们努力学习。所以,在以后的时间里,我会利用更多时间去上机实验,加强自学的能力,多编写程序,相信不久后我的编程能力会有所提高能设计出更多的更有创新的作品。

参考文献

[1]《汇编语言》李珍香 刘红梅 赵润林主编 中国水利水电出版社 [2]《汇编语言程序设计—从DOS到Windows》 张雪兰等主编 清华大学 出版社 [3]《IBM-PC汇编语言程序设计》第二版 沈美明 温冬婵主编 清华大学 出版社

[4]《IBM-PC汇编语言程序设计实验教程》第二版 沈美明 温冬婵主编 清华大学出版社

19

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- 69lv.com 版权所有 湘ICP备2023021910号-1

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务