ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:36.11KB ,
资源ID:10046667      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-10046667.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(大奖赛记分程序设计.docx)为本站会员(b****0)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

大奖赛记分程序设计.docx

1、大奖赛记分程序设计南京工程学院课程设计报告书课 程 名 称 微机原理及应用B 院(系、部、中心) 自动化学院 专 业 班 级 姓 名 学 号 起 止 日 期 指 导 教 师 目 录一、设计题目二、设计任务(要求)三、总体方案四、原理框图五、系统模块详细设计与调试六、设计总结七、参考文献八、附件材料一、设计题目 大奖赛记分程序设计二、设计任务(要求)1、设计要求编制一个程序,实现选手成绩的平均分计算。设有十个评委给参赛的选手评分,分数是从键盘上输入的十个十进制数(一位或两位)。(1) 把输入的十进制数转换成二进制数,并求出最大数和最小数;(2) 求出十个数的总和,减去最大数和最小数,求出平均值;

2、(3) 将二进制的平均值转换成十进制,并在屏幕上显示十进制的结果。2、界面要求(1) 首先显示器显示:“PLEASE IUPUT THE 10 SCORES!”;(2) 输入成绩后屏幕上显示十个分数,以及最后的平均值;(3) 要求输入的分数以“Enter”键结束。三、总体方案1、利用DOS中断的09号功能,在屏幕上显示提示语句,要求输入十个分数。 MOV AH, 09H MOV DX, OFFSET BUF; BUF为存放十个分数的存储区首地址 INT 21H设置数据保存区,将转换后的二进制数存入其中。2、将输入的十进制数转换为二进制数。因为从键盘接收的数据是以ASCII码存放在数据缓冲区,并

3、且两位数的十位和个位分别存放在两个地址单元,可先将其转换成BCD数,然后再利用除法ASCII码调整指令AAD将其转换成二进制数。3、求十个数中的最大数和最小数。假设第一个数是最大数,并送到MAX单元中,依次把余下的数与MAX单元中的数相比较,如大于MAX中的数,则把此数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数,同理可求出最小数。4、计算十个数的总和再减去最大数和最小数,最后除以8,即求出平均数。5、最后所得结果是二进制数,可先除以10,商就是十位,余数就是个位。分别加上30H转换为ASCII码,利用DOS中断的02H功能可在屏幕上显示结果。 MOV AH, 02H INT

4、21H ; DL存放要显示的数的ASCII 码四、原理框图主程序流程图如下:五、系统模块详细设计与调试(一)系统模块详细设计1、模块一:宏指令的定义与调用在显示器提示信息后和输入数据后,都需要回车换行,在本程序中用一个宏指令CRLF来实现。宏指令CRLF中又调用了另外一个宏指令DOSFUNC,这是一个带参数的宏指令。宏指令需定义在程序的最前面。宏定义:DOSFUNC MACRO NO ;定义宏指令DOSFUNC MOV AH,NO INT 21H ENDM ;宏DOSFUNC结束CRLF MACRO ;定义宏指令CRLF MOV DL,0DH ;回车 DOSFUNC 2 ;2号功能调用显示字符

5、 MOV DL,0AH ;换行 DOSFUNC 2 ENDM ;宏CRLF结束CRLF宏指令用2号DOS功能调用(显示一个字符)显示回车符与换行符的方法来实现回车换行。2号DOS功能在显示回车符与换行符时实际上只是把光标移到下一行的开始,而并非把0DH和0AH显示在屏幕上。宏调用:在程序中凡是需要进行回车换行的地方只要把CRLF当作一条无操作数指令直接插入该处即可。在程序中若要使用DOSFUNC宏指令,需要在DOSFUNC宏指令后带上实参(功能调用的功能号)。2、模块二:数据段的定义DATA SEGMENT ;定义数据段MESSAGE DBPLASE INPUT THE 10 SCORES!0

6、DH,0AH,$;键盘缓冲区NUMBERS DB 10 DUP(?) ;键入的数据转换成二进制后放在此处KB DB 3 ;定义可接收最大字符数(包括回车键)ACTLEN DB ? ;实际输入的字符数BUFFER DB 3 DUP(?) ;输入的字符放在此区域中MAX DB ? ;最大数MIN DB ? ;最小数DATA ENDS ;数据段结束键盘缓冲区第一个字节存放它能保存的最大字符数,第二个字节存放实际输入的字符数(由0AH号功能负责填入),用户从键盘输入的字符串从第三个字节放起,用户以Enter键结束本次输入。如果输入的字符数超过所定义的键盘缓冲区所能保存的最大字符数,0AH功能将拒绝接收

7、多出的字符。输入结束时的Enter键也作为一个字符(0DH)放入字符缓冲区,因此设置的缓冲区应比希望输入的字符数多一个字节。在调用0AH号功能前需将键盘输入缓冲区的偏移地址放到DX寄存器中。3、模块三:代码段的定义CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,ES:DATASTART:MOV AH,00H MOV AL,03H INT 10H (设置屏幕显示方式)MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,MESSAGE DOSFUNC 9 ;显示MESSAGE ;(1)从键盘读入数据并转换成二进制数保存。因为从键盘接收

8、的数据是以ASCII码存放在数据缓冲区,并且两位数的十位和个位分别存放在两个地址单元。对于一位数,可将其转换为BCD数,即为二进制数;两位数可先将其转换成BCD数,然后再利用除法ASCII码调整指令AAD将其转换成二进制数。因此在转换数制前需判定输入的数的位数,然后跳入相应的程序段中完成ASCII码到二进制数的转换。 MOV CX,10 LEA DI,NUMBERS ;设置数据保存区指针L1: LEA DX,KB DOSFUNC 0AH ;从键盘读数据 CMP ACTLEN,0 JZ L1 CMP ACTLEN,1 JNZ L2 MOV AL,BUFFER ;若只有一个数字 AND AL,0F

9、H ;转换成二进制数 JMP L3L2: MOV AH,BUFFER ;若有两个数字 MOV AL,BUFFER+1 AND AX,0F0FH ;转换成BCD数 AAD ;转换成二进制数L3: STOSB ;保存数据 CRLF LOOP L1 ;直到10个数据都输入完 ;(2)求最大数和最小数。假设第一个数是最大数,并送到MAX单元中,依次把余下的数与MAX单元中的数相比较,如大于MAX中的数,则把此数送到MAX单元中,否则取下一个数,最后MAX单元中即为最大数,同理可求出最小数。L4: MOV CX,9 ;比较次数 LEA SI,NUMBERS ;数据保存区首字的偏移地址送至寄存器SI MO

10、V AL,SI ;取第一个数送AL MOV MAX,AL ;将第一个数送至MAX单元 MOV MIN,AL ;将第一个数送至MIN单元COMP: INC SI MOV AL,SI ;取下一个数 CMP AL,MAX ;与MAX单元中的数比较 JL NEXT ;若不大于MAX 中的数则跳到NEXT继续执行 MOV MAX,AL ;否则将其送到MAX单元中 JMP SHORT LOPNEXT: CMP AL,MIN JG LOP ;若不小于MIN中的数则跳LOP继续执行 MOV MIN,AL ;否则将其送至MIN单元中LOP: LOOP COMP;(3)计算十个数的总和再减去最大数和最小数,最后除

11、以8,即求出平均数。 LEA SI,NUMBERS ;数据保存区首字的偏移地址送至寄存器SI MOV CX,9 MOV AL,SI ;取第一个数 MOV AH,0 ;AH清零L5: INC SI MOV DL,SI ;取下一个数 MOV DH,0 ;DH清零 ADC AX,DX ;求和,并将结果送至AX LOOP L5 ;求出十个数的总和L6: MOV BL,MAX ;取最大数 MOV BH,0 SUB AX,BX ;十个数的总和减去最大数 MOV BL,MIN ;取最小数 MOV BH,0 SUB AX,BX ;再减去最小数 MOV BL,8 DIV BL ;求平均数 ;(4) 所得结果是二

12、进制数,可先除以10,商就是十位,余数就是个位。分别加上30H转换为ASCII码,利用DOS中断的02H功能可在屏幕上显示结果。 MOV CL,AH ;将求得平均数后的余数送至CL AND AX,0FFH ;AH清零 MOV BL,10 DIV BL MOV CH,AH ;平均数的个位送至CH MOV DL,AL ;十位送至AL ADD DL,30H ;转换成ASCII码 MOV AH,02H INT 21H ;显示十位 MOV DL,CH ADD DL,30H MOV AH,02H INT 21H ;显示个位 MOV DL,2EH MOV AH,02H INT 21H ;显示小数点 MOV

13、AL,CL ;取余数 MOV BL,10 MUL BL MOV BL,8 AND AX,0FFH DIV BL MOV DL,AL ADD DL,30H ;将余数转换为ASCII码 MOV AH,02H INT 21H ;显示小数点后的数 MOV AH,4CH INT 21H ;返回DOSCODE ENDS ;代码段结束 END START ;程序结束(二)系统调试源程序建立以后,要对其进行汇编。汇编程序会指出源程序中的错误,这些错误要经过调试阶段才能纠正,从而得到正确的结果。常用的调试程序为DEBUG程序,它通过单步、设置断点等方式提供了非常有效的调试手段。将源程序经过汇编后得到没有语法错误

14、的OBJ文件,然后用连接程序(LINK)把OBJ文件转换成可执行的EXE文件,在DOS环境下可直接运行该文件,但运行后系统提示除数溢出。我在程序中找不到错误,只好用DEBUG调试。只需退出EDIT环境,输入TDEBUG加文件名之后回车,就可进入DEBUG程序环境,对源程序进行调试。我根据系统提示,利用F8单步执行程序,观察每一步的结果。当执行到数制转换那里时,我发现结果出现了问题,两位数转换之后还是正确的,但一位数就不对了,它的高八位居然是前面输入的两位数的高位,接下来输入的数转换后的结果也不正确。原先数制转换部分程序如下: CMP ACTLEN,0 JZ L1 CMP ACTLEN,1 JN

15、Z L2 MOV AL,BUFFER ;若只有一个数字 AND AL,0FH ;转换成二进制数 JMP L3L2: MOV AH,BUFFER ;若有两个数字 MOV AL,BUFFER+1 AND AX,0F0FH ;转换成BCD数 AAD L3: MOV SI,AX INC SI LOOP 由于SI是十六位存储器,执行INC SI每次只加一个字节,两位数在保存时就会出现问题,因为转换后的两位数要占两个字节,可以把两位数与一位数分开保存或采用串传送指令一位位保存。 L3段修改后修改后如下: L3: STOSB ;保存数据 CRLF LOOP L1 ;直到10个数据都输入完 把这个错误改正过来

16、以后,后面的除数溢出问题也就迎刃而解了。六、设计总结 七、参考文献1、微机原理实验与课程设计指导书,陆红伟编,中国电力出版社,2006年2、8086微型计算机组成、原理及接口,顾滨编,机械工业出版社,2001年3、微机原理及应用,徐晨、陈继红、王春明、徐慧编,高等教育出版社,2004年4、微型计算机原理与接口技术题解及实验指导,陈文革等编,清华大学出版社,2003年5、微型计算机原理及应用,吕叔萍等编,哈尔滨工程大学出版社,2004年6、微型计算机技术及应用,戴梅萼编,清华大学出版社,2005年八、附件材料程序清单如下:DOSFUNC MACRO NO ;定义宏指令DOSFUNC MOV AH

17、,NO INT 21H ENDM ;宏DOSFUNC结束CRLF MACRO ;定义宏指令CRLF MOV DL,0DH ;回车 DOSFUNC 2 ;2号功能调用显示字符 MOV DL,0AH ;换行 DOSFUNC 2 ENDM ;宏CRLF结束DATA SEGMENT ;定义数据段MESSAGE DB PLASE INPUT THE 10 SCORES!0DH,0AH,$;键盘缓冲区NUMBERS DB 10 DUP(?) ;键入的数据转换成二进制后放在此处KB DB 3 ;定义可接收最大字符数(包括回车键)ACTLEN DB ? ;实际输入的字符数BUFFER DB 3 DUP(?)

18、;输入的字符放在此区域中MAX DB ? ;最大数MIN DB ? ;最小数DATA ENDS ;数据段结束CODE SEGMENT ;定义代码段 ASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AH,00H MOV AL,03H INT 10H (设置屏幕显示方式)MOV AX,DATA MOV DS,AX MOV ES,AX LEA DX,MESSAGE DOSFUNC 9 ;显示MESSAGE MOV CX,10 LEA DI,NUMBERS ;设置数据保存区指针L1: LEA DX,KB DOSFUNC 0AH ;从键盘读数据 CMP ACTLEN,0

19、 JZ L1 CMP ACTLEN,1 JNZ L2 MOV AL,BUFFER ;若只有一个数字 AND AL,0FH ;转换成二进制数 JMP L3L2: MOV AH,BUFFER ;若有两个数字 MOV AL,BUFFER+1 AND AX,0F0FH ;转换成BCD数 AAD ;转换成二进制数L3: STOSB ;保存数据 CRLF LOOP L1 ;直到10个数据都输入完L4: MOV CX,9 ;比较次数 LEA SI,NUMBERS ;数据保存区首字的偏移地址送至寄存器SI MOV AL,SI ;取第一个数送AL MOV MAX,AL ;将第一个数送至MAX单元 MOV MIN

20、,AL ;将第一个数送至MIN单元COMP: INC SI MOV AL,SI ;取下一个数 CMP AL,MAX ;与MAX单元中的数比较 JL NEXT ;若不大于MAX 中的数则跳到NEXT继续执行 MOV MAX,AL ;否则将其送到MAX单元中 JMP SHORT LOPNEXT: CMP AL,MIN JG LOP ;若不小于MIN中的数则跳LOP继续执行 MOV MIN,AL ;否则将其送至MIN单元中LOP: LOOP COMP LEA SI,NUMBERS ;数据保存区首字的偏移地址送至寄存器SI MOV CX,9 MOV AL,SI ;取第一个数 MOV AH,0 ;AH清

21、零L5: INC SI MOV DL,SI ;取下一个数 MOV DH,0 ;DH清零 ADC AX,DX ;求和,并将结果送至AX LOOP L5 ;求出十个数的总和L6: MOV BL,MAX ;取最大数 MOV BH,0 SUB AX,BX ;十个数的总和减去最大数 MOV BL,MIN ;取最小数 MOV BH,0 SUB AX,BX ;再减去最小数 MOV BL,8 DIV BL ;求平均数 MOV CL,AH ;将求得平均数后的余数送至CL AND AX,0FFH ;AH清零 MOV BL,10 DIV BL MOV CH,AH ;平均数的个位送至CH MOV DL,AL ;十位送

22、至AL ADD DL,30H ;转换成ASCII码 MOV AH,02H INT 21H ;显示十位 MOV DL,CH ADD DL,30H MOV AH,02H INT 21H ;显示个位 MOV DL,2EH MOV AH,02H INT 21H ;显示小数点 MOV AL,CL ;取余数 MOV BL,10 MUL BL MOV BL,8 AND AX,0FFH DIV BL MOV DL,AL ADD DL,30H ;将余数转换为ASCII码 MOV AH,02H INT 21H ;显示小数点后的数 MOV AH,4CH INT 21H ;返回DOSCODE ENDS ;代码段结束 END START ;程序结束

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2