资源描述
目 录
摘 要 1
1概述 2
1.1任务规定 2
1.2编程环境 2
2分析 3
2.1程序功能 3
2.2设计思路 3
3程序流程图 4
3.1主程序流程图 4
3.2子程序流程图 5
4程序调试 8
5心得与体会 9
参照文献 11
摘 要
用汇编语言编写程序可以直接运用硬件系统特性直接对位、字节或字寄存器、存储单元、I/O端口进行解决,同步也能直接使CPU指令系统和指令系统提供各种寻址方式编出高质量程序。汇编程序是最早也是最成熟一种系统软件,可以将汇编语言源程序翻译成机器语言程序,可以自动对源程序进行检查给出错误信息等。本阐明书重要简介了用汇编语言编写程序计算比赛成绩设计思路和编程流程图,以及调试程序时心得与体会。
核心词 汇编 流程
比赛评分系统程序设计
1概述
1.1任务规定
① 比赛选手人数控制在30如下;
② 9个评委,每个评委给分范畴为0~10分(整数),随机给出分数
③ 9个评委给分中,去掉一种最高分和一种最低分,余下7位评委平均分即为参加者得分(精准到小数点后一位);
④ 将分数在屏幕中间位置处用红色显示出来;
⑤ 将参加比赛选手排名顺序显示出来。
1.2编程环境
把汇编语言翻译成机器语言过程称为汇编,为了实现这一过程对的运营汇编语言,系统需具备如下编辑程序:
Masm.exe
Link.exe
Debug.exe
Masm为宏汇编程序,负责对源文献进行汇编;link为连接程序,把汇编后产生目的模块连接在一起,产生可执行文献;debug是调试程序,它是调试汇编语言程序必不可少工具。
2分析
依照设计任务书分析得出程序规定具备功能,进而写出自己设计思路。
2.1程序功能
依照设计任务规定可以得出所涉及程序必要具备如下功能
(1) 显示选手序号
(2) 显示9个评委评分
(3) 用红色字体显示每位选手平均分
(4) 依照选手平均得分排序(本程序按照分数由高到低排列)
2.2设计思路
重要采用循环构造和子程序调用基本构造形式,编写程序产生9个0~10随机数,找出这9个数中最大和最小数,即评委给出最高分和最低分,分别保存。
再对这9个数求和,减去前面保存最大数和最小数,所得值除以7,即为选手平均分,分别保存整数某些和小数某些。保存该分数并在屏幕中间用红色显示出来。以上过程循环30次,然后依照平均分高低对选手进行排序并调用BIOS功能使平均分为红色显示。
为了使程序以便阅读和修改,减少编程工作量,节约存储空间,并易于实现程序模块化,在编写程序时候尽量把某些具备特定功能程序段独立出来编写成可以被其她程序多次调用子程序,然后在主程序需要地方调用。汇编程序中CALL和RET指令就是完毕子程序调用和返回功能。
有了以上基本设计思路,便可以着手准备开始编写流程图,然后再查阅有关资料巩固关于汇编语言指令系统以及寻址方式知识和使用技巧,复习调试程序办法以及常用问题解决办法等等。
3程序流程图
流程图是算法图形描述,它以图形方式把解决问题先后顺序和程序逻辑构造直观地、形象地描述出来,使得编程思路清晰,有助于编制、调试程序。
3.1主程序流程图
开始
从40H端口读入一种随机数
除以11产生9个0~10随机整数,保存
找出9个随机数中最大值和最小值
9个数相加减去最大值、最小值
除以7得平均分,保存
不大于30次
控制循环30次
不不大于等于30次
将各选手按照平均分降序排列
显示选手序号、9个评委评分和红色字体平均分
结束
图3-1 主程序流程图
为了使程序简洁明了和易于调试查错,因而把流程图提成了几种某些。主程序流程图如上图3-1所示,由流程图中可以看出程序重要设计思路和整体框架。
3.2子程序流程图
对于某些具备特殊功能程序可以编制成子程序,通过调用来实现功能,这样有助于程序读和写,也易于查错,因而本题将显示指定字符串、显示十进制ASCII码、查找最高分最低分过程编写成子程序以供调用,以便简洁明了,可以更快地拟定编程方向和目,找出解决问题最佳途径。由于显示指定字符串、显示十进制ASCII码涉及DOS功能调用,指令简朴,为汇编者所熟记知识,可以不用流程图再次赘述。查找最高分最低分流程图如图3-2所示,从图中可以看出,找出最高分办法和查找最低分办法类似,只需更改其中个别指令,即可达到目。
开始
开始
取出一种数
取出一种数
与下一种数作比较
不不大于等于?
与下一种数作比较
不大于等于?
与下一种数作比较
与下一种数作比较
与下一种数作比较
不不大于等于?
不变
替代
N
不变
替代
N
不变
N
N
Y
N
Y
替代
不变
保存该数为最高分
结束
保存该数为最高分
保存该数为最高分
保存该数为最高分
结束
图3-2 查找最高分和最低分程序流程图
将各个选手按照所得平均分排序程序流程图如图3-3所示。由于参赛选手人数不多,采用冒泡法排序可以达到迅速、精确效果。
数据排序采用冒泡法降序排列,将其两两比较。前一种数较大,则不变化原位置,否则两数互换,一次将所有数据排序,排序次数由需要排序数据个数决定。这种排序办法是从最低部元素开始进行比较,较小元素将会像气泡同样往上冒。
在排序过程中,外循环遍历要排序元素,内循环用于挑选出最值。内循环用于将相邻两个元素进行比较,将小元素调到大元素前头,内循环循环次数表达相邻元素互换趟数。
结束
开始
此外,在整个程序中,除了这三个重要环节,还需要编写子程序用于显示字符串,产生随机数等等,这些模块编程思路比较直观,因此在流程图中没有着重表白。
比较相邻两个数大小
循环29次
前一种数大?
N
Y
顺序互换
顺序不变
不大于29
不不大于等于29
保存成果并显示
图3-3 将平均成绩排序流程图
有了编写汇编语言计算比赛成绩思路和流程图之后,通过查找某些不常用指令和查阅有关参照资料,就可以编写出初步源程序。
4程序调试
通过调试程序,得出随机给出选手得分运营成果如图4-1所示。
图4-1 随机给出选手得分
最后排名和选手所得分数如图4-2所示。图中给出了24位选手成绩和排名,排名顺序为从高分到低分,最后一列为各个选手所得平均分,用红色显示。
图4-2 选手排名顺序
5心得与体会
在本次比赛评分系统程序设计过程中,本小组各成员积极配合想算法,分工协作写程序,历经百般波折,通过几种昼夜艰难奋战,终于在咱们几近绝望最后关头突然跳出来一种窗口,程序运营成功了,人们手舞足蹈、欢欣雀跃,总算努力没有白费,俗话说得好:坚持,就意味着一切。本次微机原理课程设计感受颇深,受益匪浅。
由于初学汇编语言,再加上平时习题都很简朴并且规定不高,因此在看到题目时候,一开始有些傻眼不知从何着手,仔细看了看想了想查了查资料后发现把问题分块解决,各个击破,最后再拧成一股绳,问题貌似就变得简朴诸多,重要是如何拧成一股绳,从何处开始拧,也就是如何把各个子程序在何处调用才干实现功能,这个问题的确需要大动脑筋才干保证最后成果和设计规定相符。第一次上机用汇编编写程序,第一次接触用汇编语言程序产生随机数,第一次尝试着编写子程序,也是第一次据说尚有BIOS功能调用。
万事开头难,但总要开个头,第一天没着落,就想啊,查资料,通过小构成员讨论后决定各成员分工合伙,每人负责一种功能,最后一起合成调试。然后各自就开始努力工作了,先是依照规定把也许用到书中知识复习巩固了一遍,然后对准问题查阅有关资料,遇到相似问题就借鉴过来,再依照实际问题需要编写自己程序,就这样一步步按照流程做了下来,途中遇到了诸多问题,但是问题必要解决才干继续往下写,虽然好些天疲于奔命于图书馆、书店,但是有压力就有动力,逐渐问题变得越来越少。
编写程序过程中,开始是一塌糊涂,对某些伪指令和DOS功能调用以便掌握不牢固,编写起程序来很不灵活,通过查阅资料和询问同窗,在边摸索边实践过程中,我体会到了编写程序不但需要广泛进一步知识面,还需要灵活头脑和严密逻辑思维,稍有考虑不到方面,程序就会“没有生成OBJ文献”。
循序渐进,我终于编写出了我脑子里所想初步程序,但输入到MF2KP集成开发环境中运营时,一开始热情瞬间就没了,程序无法编译,不能生成.obj文献,想了许久,明白了一点:编写程序最重要其实不是在于如何编写而是成百上千次甚至上万次不断调试。于是,我开始了调试程序这复杂而又极其漫长过程。
最后在小构成员共同努力下,咱们成功了,一股成就感袭上心头,各个都笑了,也松了口气,回头想想,不但巩固了所学知识,并且锻炼咱们理论结合实际能力和团队合伙能力。同步也发现了些许局限性,我敢必定是这次发现问题被牢紧记住了,还起了个加深记忆作用。通过本次课设我发现,定义变量是可以直接用inc、dec,即对其内容值加1、减1,但是要注意,虽然变量可以当作符号地址,但是此处只是把它们数据内容加1或减1,而非对其地址,之前我觉得不能直接对定义好变量用inc、dec;使用十六进制数时,若第一种数位值是字母,要在在其前加0,否则会被以为是变量;寄存器、变量之间传递值时,位数要一致;使用push后记得相应地使用pop,还要注意两者应反序,即push ax,push bx,push cx与pop cx,pop bx,pop ax相相应;在子过程中 ret 处之前应放上相应地放上pop语句,而子过程入口处应相应放上push语句;要养成良好程序书写习惯,例如标号对齐、参数对齐、注释对齐,这样看起来赏心悦目,也不容易出错,也易于排错修改;标号最佳采用故意义英文,这样比较直观,注释尽量详细精确,便于阅读,并且有助于其他程序中作为子程序模块调用。尚有要注意典型程序模块积累,再复杂程序也是由一种个小程序模块构成。
这些问题是这次课程设计体会比较深刻几种方面。
综上所述,通过本次比赛评分系统程序设计,不但巩固了所学汇编知识,并且在知识广面和深面上有了相称限度拓展。几种枯燥字母被咱们这一折腾居然变得有了活力,使我感觉到汇编强大魔力,编程就像寻常生活同样,是个不断摸索和发现过程,途中必然会遇到困难,前面浮现坎儿,是由于对面就是平原,编程序要懂得:坚持,就意味着一切。
参照文献
[1]沈美明,温冬蝉.IBM-PC汇编语言程序设计(第2版).清华大学出版社,
[2]沈美明,温冬蝉.IBM-PC汇编语言程序设计例题习题集.清华大学出版社,1991
[3]陆忠华.汇编语言程序设计.科学出版社,1993
[4]迟成文,王保秀.汇编语言程序设计.中华人民共和国科学技术大学出版社,1993
[5]徐建民.汇编语言程序设计.电子工业出版社.
[6]彭虎,周培玲,傅忠谦.微机原理与接口技术(第2版).电子工业出版社,
附录
Code Segment
Assume CS:Code,DS:Code
;-------------------------------------
;功能:显示指定地址(Str_Addr)字符串
;入口:
;Str_Addr=字符串地址(规定在数据段)
;用法:Output Str_Addr
;用法举例:Output PromptStr
Output MACRO Str_Addr
push ax
lea dx,Str_Addr
mov ah,9
int 21h
pop ax
EndM
;-------------------------------------
;功能:把AX中二进制无符号数转换成显式十进制ASCII码,并送显示屏显示
;入口:AX=二进制数
;出口:在当前光标位置显示转换后ASCII码数字
Dec_ASCII Proc Near
mov dh,10
div dh
or ax,3030h ;将两位十进制数转换成ASCII码
cmp al,30h
ja $+4
mov al,20h ;若十位数是0,以空格代替
push ax
mov ah,0eh
int 10h ;显示十位数
pop ax
xchg ah,al
mov ah,0eh
int 10h ;显示个位数
ret
Dec_ASCII EndP
;-------------------------------------
Commentators equ 9 ;评委人数
Contestants equ 23 ;参赛选手人数
Press_Key db 0ah,0dh,'The complated. Press any key to exit...$'
Start: mov di,64 ;显示缓冲区偏移地址
mov ax,0b800h ;显示缓冲区段地址
mov es,ax
mov al,20h
mov ah,4 ;字符颜色(红色)
mov cx,Contestants ;参赛选手人数
cld
@@Line: push cx
mov cx,3
rep stosw
add di,154 ;显示缓冲区下一行同列偏移地址
pop cx
loop @@Line
push cs
pop ds ;使数据段与代码段同段
push cs
pop es ;使附加段与代码段同段
;-------------------------------------
;评委随机打分
cld
lea si,Buffer ;数据缓冲区地址(选手成绩链表)
mov di,si
add di,Contestants*2 ;选手成绩存储地址
mov cx,Contestants ;参赛选手人数
mov dl,11 ;除数
Grade_0: push cx
mov [si],di ;选手成绩地址
inc si
inc si ;下一种链表节点地址
mov ax,Contestants+1
sub ax,cx ;选手序号
stosb ;保存选手序号
xor bx,bx ;BH=,最高分初值,BL=最低分初值
xor dh,dh ;选手总分初值
mov cx,Commentators ;评委人数
Grade_1: xor al,al
out 43h,al
in al,40h
xor ah,ah
div dl
xchg ah,al ;舍弃商数,取余数,作为某评委打分
stosb ;保存一种评委打分
add dh,al ;合计评委打分
cmp bh,al
jae $+4 ;最高分>=此评委打分
mov bh,al ;保存新最高分
cmp bl,al
jbe $+4 ;最低分<=此评委打分
mov bl,al ;保存新最低分
loop Grade_1
mov al,dh
sub al,bh ;减去一种最高分
sub al,bl ;减去一种最低分
stosb ;保存最后得分
pop cx
loop Grade_0
;-------------------------------------
;用冒泡排序法对选手最后得分降序排序
lea si,Buffer ;选手成绩链表地址
mov cx,Contestants ;参赛选手人数
dec cx ;外循环次数
Sorting: push cx ;入栈保存外循环次数
push si ;入栈保存数组地址
Compare: push si
pop di ;当前数组元素地址赋给目变址寄存器,以备互换之用
lodsw ;将当前数组元素读入累加器
mov bx,ax
mov al,[bx][10] ;将当前最后得分读入累加器AL
mov bx,[si] ;相邻下一种选手信息地址
cmp al,[bx][10] ;当前选手最后得分与相邻下一种选手最后得分相比较
jae NextOne ;若不不大于或等于,不作数据互换,解决下一种数组元素
mov ax,[di] ;若不大于,读入当前选手信息链表节点
xchg ax,[si] ;互换链表元素
mov [di],ax ;保存数值较大者节点地址
NextOne: loop Compare ;解决下一种数组元素
pop si ;数组地址出栈
pop cx ;外循环次数出栈
loop Sorting ;下一趟比较
;-------------------------------------
;按总成绩降序显示所有选手各评委打分、平均得分
mov cx,Contestants ;参赛选手人数
xor bh,bh ;显示页号0
Contestant:push cx
push si
mov si,[si] ;读入链表节点(某选手成绩地址)
lodsb ;读入选手序号
xor ah,ah
call Dec_ASCII ;显示参赛选手序号
mov ah,0eh
mov al,':'
int 10h
mov al,20h
int 10h ;空一格
mov cx,Commentators ;评委人数
Commentator:xor ah,ah
lodsb ;读入选手某评委打分
call Dec_ASCII ;显示分数
mov ax,0e20h
int 10h ;空一格
loop Commentator
int 10h ;空一格
lodsb ;读入选手最后得分
xor ah,ah
mov dl,Commentators-2 ;评委人数-2
div dl ;AL=商数,AH=余数
mov bl,ah
or al,30h
mov ah,0eh
int 10h ;显示平均得分商数
mov ah,0eh
mov al,'.'
int 10h ;显示小数点
mov al,bl
mov bl,10
mul bl
div dl
or al,30h
mov ah,0eh
int 10h ;显示平均得分小数
mov ax,0e0dh
int 10h
mov al,0ah
int 10h
pop si
inc si
inc si ;下一种链表节点地址
pop cx
loop Contestant
;-------------------------------------
Exit_Proc:Output Press_Key ;提示操作完毕,按任意键结束程序
mov ah,1
int 21h
mov ah,4ch ;结束程序
int 21h
Buffer:;数据缓冲区
Code ENDS
END Start ;编译到此结束
展开阅读全文