一、设计内容与设计要求
1.课程设计目的:
《汇编语言程序设计》是计算机专业的重要的专业基础课,通过本课程设计使学生进一步巩固课堂所学,全面熟悉、掌握8088宏汇编语言程序设计的基本方法和技巧,进一步提高编写程序、阅读分析程序及上机操作、调试程序的能力。
2.课题题目
1)测量任意程序的运行时间
2)读入一个文本文件并以DEBUG中的D命令格式显示。
3)文件加密程序
4)编写一个时钟程序
5)画网格线
6)画脉冲波图形
7)用“*”画菱形框
8)计算比赛成绩
3.设计要求:
1)在一周内学生须上机16小时以上,程序调试完后,须由指导老师在机器上检查运行结果,经教师认可后的源程序可通过打印机输出。
2)分组及安排
A.每组同学必须完成所指定的题目,每个同学须自己完成设计,应有不同的思路。
B.按学号分组,第一组为1、9、17、25、33号同学,第二组为2、10、18、26、34号,第三组为3、11、19、27、35号,依次类推,其中第一组做第一题,第二组做第二题,依次类推。
3)按规定格式完成课程设计报告,将其打印稿(A4纸)上交给老师存档。
4)不得抄袭他人程序、课程设计报告,每个人应体现自己的个性设计,成绩的考核按上机表现、答辩成绩及课程设计说明书来综合评定。成绩分为优、良、中、及格、不及格五级分评定。
二、进度安排
第15 周
星期三 14时:00分——18时:00分
星期日 8时:00分——12时:00分
第16 周 星期一 14时:00分——18时:00分
星期三 8时:00分——12时:00分
星期三 14时:00分——18时:00分
星期五 8时:00分——12时:00分
课题1.测量任意程序的运行时间
要求:该程序驻留内存
思路:DOS操作系统中,程序的调入运行及程序的终止均是通过相应的软中断来实现的。若窃取相应软中断,记录下程序开始调入运行的时间及程序终止的时间,则可测量出该程序运行的时间。
提示要点:与之相关的软中断分别为:
程序开始执行:4BH号系统功能调用(INT 21H)
程序结束: INT 20H
INT 27H
00H、3lH、4CH号系统功能调用(INT 21H)
课题2.读入一个文本文件并以DEBUG中的D命令格式显示。
要求:A、以DEBUG中的D命令格式显示一个文本文件。
B、文件名从键盘键入。
思路:A、打开相应文件,读内容至程序缓冲区。
B、按要求显示。
课题3.文件加密程序
要求:A、文件名从键盘输入。
B、加密密钥从键盘输入。
思路:从原文件读取内容至缓冲区,对其加密后,重新写回文件原来的地方。
提示要点:A、加密可使用“异或”操作。
B、相关中断为3DH,3EH,3FH,40H,42H号系统功能调用(INT 21H)
课题4.编写一个时钟程序
要求:A、驻留内存。
B、不影响其它程序运行。
C、把时钟信号显示在屏幕固定位置(最好为右上角)。
思路:先从系统实时钟取得当前时间,每隔约0.05秒定时器向CPU发出一次8号中断请求,是一个硬中断。窃取 INT 1CH中断服务程序。
课题5.画网格线
要求:A、背景为蓝色、横线为红色、直线为黄色。
B、按用户输入的起点和终点坐标、列距和行距的大小画出任意条横竖线。
C、参数以十进制数形式输入,格式如下:
Please enterstarting point (x1,y1):XX, XX
Please enterending point (x2,y2):XX, XX
Please enterdistance (row,col):XX, XX
课题6.画脉冲波图形
要求:用户以十进制数形式从键盘输入脉冲高度、脉冲宽度和颜色参数(格式同上)后,以屏幕中间行为脉冲中间行,从左到右、满屏画出相应的脉冲波图形。
课题7.用“*”画菱形框
要求:A、背景为蓝色、“*”为红色,菱形框画在屏幕中间,菱形中间为空格。
B、用户以十进制数形式输入菱形宽度和高度(格式同上)。
课题8.计算比赛成绩
要求:A、7个评委,每个评委给分范围为0~10分(整数)。
B、7个评委的给分中,去掉一个最高分和一个最低分,余下5位评委的平均分即为参加者的得分(精确到小数点后一位)。
C、将分数在屏幕中间位置处用红色显示出来。
目 录
1. 题目... 1
2. 程序总体设计方案、思路... 1
3. 程序设计框图... 1
4. 源程序清单... 5
5. 程序调试结果及分析... 12
6. 设计总结... 13
1. 题目
计算比赛成绩
要求:A、7个评委,每个评委给分范围为0~10分(整数)。
B、7个评委的给分中,去掉一个最高分和一个最低分,余下5位评委的平均分即为参加者的得分(精确到小数点后一位)。
C、将分数在屏幕中间位置处用红色显示出来。
2. 程序总体设计方案、思路
程序总体设计可分为三个部分,三个子函数,先定义一段7个字节的内存空间ARRY存放7个评委给出的分数,定义两个2字节存放最大和最小分数、2个字节存放平均分数以及一些信息字符串,第一个子函数DIB用于输入7个分数,第二个子函数FIND用于找出7个分数中的最大值和最小值并存放到预先定义的两个字节中,第三个子函数C_DISP计算出7个分数的平均值并输出显示,先将7个数相加,加完后再减去存放在内存里的最大和最小分数,最后除以5得到平均值,最后结合显示器中断调用(INT 10H)输出平均分数,程序大致就这个过程。
3. 程序设计框图
汇编程序流程图
图3.1 程序流程图,从开始到结束调用了三个子程序。
DIB子程序流程图
图3.2 DIB子程序流程图,输入7个数字到ARRY数组,
这个流程图的工序有些复杂,但还是准确表达子程序的思想。
FIND子程序流程图
图3.3 FIND子程序是一个利用了一个简单的算法来找出ARRY
数组里的最大和最小值,并存储和显示出来。
C_DISP子程序流程图(简约流程图)
图3.4 子程序C_DISP的流程图,其实这个子程序是比较
复杂的,程序里面用字母’A’替代了10,在累加和输出以及求平均数时的小数处理细节没有写出来。
4. 源程序清单
;
2009年6月3日星期三 9:6:51
DATA SEGMENT
ARRY DB 8DUP(?)
MAX_MIN DB0,'A'
SCORE DB 2DUP(?)
MESSAGE DB'Please enter the seven consecutive Score(0~10):$'
MESSAGE_MAXDB 0DH,0AH,'Max score:$'
MESSAGE_MINDB 0DH,0AH,'Min score:$'
MESSAGE_AVEDB 0DH,0AH,'Average score:$'
DATA ENDS
CODE SEGMENT
ASSUMECS:CODE,DS:DATA
START:MOV AX,DATA
MOVDS,AX
CALLDIB
CALLFIND
CALLC_DISP
MOVAH,1
INT 21H
MOVAX,4C00H
INT 21H
;从键盘输入7个0~10的数字到arry
DIB PROC NEAR
PUSH AX
PUSH CX
PUSH SI
MOVCX,7
LEASI,ARRY
LEADX,MESSAGE ;显示提示信息
MOVAH,9
INT 21H
REP1: MOV AH,1
INT 21H
SUBAL,30H
CMPAL,0
JL REP1
CMPAL,9
JG REP1
CMPAL,1
JEREP_10
JMP PUT
REP_10:MOV AH,7 ;如果是第二次输入,调用int21h的7h功能输入,不用回显出来
INT21H
SUBAL,30H ;是0吗?
CMPAL,0
JEINPUT_A ;输入10,用'A'代替输入
INPUT_1:MOV AL,1
JMPPUT
INPUT_A:
MOVAH,2 ;如果判断出来是数字0,就回显一下,有输入10的感觉
MOVDL,'0'
INT21H
MOVAL,41H ;输入10,用'A'代替输入
PUT: MOV[SI],AL
MOVDL,2CH
MOVAH,2
INT 21H
INC SI
DEC CX
CMPCX,0
JNZREP1
EXIT1: MOV BYTE PTR [SI],'$'
POP SI
POP CX
POP AX
RET
DIB ENDP
;查找最大和最小score的函数
FIND PROC NEAR
PUSH BX
PUSH CX
PUSH SI
MOV CX,7
LEASI,ARRY
REP2:MOV BL,[SI]
CMPMAX_MIN,BL
JG NEXT
MOVMAX_MIN,BL
NEXT:CMP MAX_MIN+1,BL
JL NEXT2
MOVMAX_MIN+1,BL
NEXT2:INC SI
LOOPREP2
;MAX,MIN
LEADX,MESSAGE_MAX ;显示提示信息
MOVAH,9
INT 21H
MOVDL,MAX_MIN
CMPDL,41H
JNZNEXT_0
JMPOUT1_00 ;输出A时,用'1'&'0'代替
NEXT_0:ADD DL,30H
MOVAH,2
INT 21H
JMPTO_MIN
OUT1_00:MOV AH,2
MOVDL,'1'
INT21H
MOVDL,'0'
INT21H
TO_MIN:LEA DX,MESSAGE_MIN ;显示提示信息
MOVAH,9
INT 21H
MOVDL,MAX_MIN+1
CMPDL,41H
JNZ NEXT_N0
JMPOUT1_000
NEXT_N0:ADD DL,30H
MOVAH,2
INT 21H
JMPTO_WAIT
OUT1_000:MOV AH,2
MOVDL,'1'
INT21H
MOVDL,'0'
INT21H
TO_WAIT:
MOVAH,1
INT 21H
EXIT2:POP SI
POP CX
POP BX
RET
FIND ENDP
;计算平均值得分并输出来,精确一位小数,注意,5个数字的平均值,一定最多是1位小数位
C_DISP PROC NEAR
PUSH AX
PUSH CX
PUSH DX
PUSH SI
MOV CX,7
LEASI,ARRY
MOV AL,0
REP3:MOV BL,[SI] ;将7个数都加起来到AX,最后减去MAXscore和MIN score
CMPBL,41H
JE NEXT33
ADDAL,BL
JMPNEXT3
NEXT33:ADD AL,10
NEXT3:INC SI
LOOPREP3
CMPMAX_MIN,41H
JESUB_10
SUBAL,MAX_MIN
JMPSUB_MIN
SUB_10:SUB AL,10
SUB_MIN:CMP MAX_MIN+1,41H
JESUB_N10
SUBAL,MAX_MIN+1
JMPNEXT44
SUB_N10:SUB AL,10
;CBW将AL累加起来的和扩展到AX
NEXT44:CBW
MOV BL,5
DIV BL
MOVSCORE,AL ;score放商
CMPAH,0 ;AH里是余数
JNZNEXT4 ;余数不为0就再除一次即可
MOVSCORE+1,AH
JMPPRINT
NEXT4:MOV BL,AH
MOVAL,BL
CBW
MOVBL,10
MULBL ; (ax)←(al)*(src)
MOVBL,5
DIVBL ;此处又是(al)←(ax)/(src)商,(ah)←(ax)/(src)余数一定是0了
MOVSCORE+1,AL
PRINT:MOV AH,0
MOVAL,3
INT 10H ;重新设置屏幕
LEADX,MESSAGE_AVE
MOVAH,9
INT 21H
MOVAH,2
MOVDX,0B26H
INT10H ;调整光标位置
MOVAH,9
MOVBH,0
MOVBL,0CH ;(BL)前一个控制背景颜色,后一个控制字体颜色,0为黑,C为红,0CH就是红字黑底
MOVCX,3
INT 10H
MOVDL,SCORE ;average score的整数部分
ADDDL,30H
CMPDL,3AH
JNZ NNN2
JMPOUT1_0
OUT1_0:INC CX
INT 10H
MOVDL,'1' ;输出'1'&'0'
MOVAH,2
INT 21H
MOVDL,'0'
INT 21H
JMP XSD
NNN2:MOV AH,2
INT 21H
XSD: MOVDL,'.' ;小数点
MOVAH,2
INT 21H
MOV DL,SCORE+1 ;average score小数部分,只有1位
ADDDL,30H
MOVAH,2
INT 21H
EXIT5:POP SI
POP DX
POP CX
POP AX
RET
C_DISP ENDP
CODE ENDS
ENDSTART
5. 程序调试结果及分析
图5.1 程序运行的第一个界面,这里显示的是输入7个分数之后的情况。
图5.2 这是程序运行时的第二个界面,显示了提示信息和
在屏幕中央用红色字体显示平均分数。
6. 设计总结
标签:10,MIN,汇编语言,MOVAH,MOV,INT,程序设计,成绩,21H From: https://blog.51cto.com/u_15911341/5935036