当前位置:文档之家› 微型计算机原理课程设计

微型计算机原理课程设计

微型计算机原理课程设计学院专业班级学号姓名一、目的结合微型计算机课程的学习,进一步巩固已学的知识,同时针对计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。

学会使用屏幕编辑程序——EDIT,弄懂汇编程序的上级过程以及如何运用DEBUG软件进行汇编程序的调试。

二、内容1.字符串的匹配为掌握提示信息的设置方法及读取键入信息的方法。

编写程序事先两个字符串的比较。

如相同,则显示“MATCH”,否则,则显示“NO MATCH”2.从键盘输入数据并显示的设计为掌握接受键盘数据的方法,并了解将键盘数据显示时必须转化为ASCII 码的原理。

编写程序,将键盘接受到的四位十六进制数据转化为等值的二进制数,再显示在终端上。

3.响铃设计为掌握响铃的使用方法。

编写程序,从键盘接受输入字符,如是数字N,则响铃N次,如果不是数字,则不响。

4.将键盘输入的小写字母转化成大写字母的设计为了解小写字母和大写字母在计算机内的表示方法,并学习如何进行转换,编写程序,接受键盘字符,并将其中的小写字母转变为大写字母,然后显示在屏幕上。

5. 学生成绩名次表设计为进一步熟悉排序方法,编写程序,将100以内的30个成绩存入首址为1000H 的存储区中。

1000H+i表示学号为i的学生成绩。

编写程序使得在2000H开始的区域排出名次表,2000H+i为学号i的学生的名次。

编写程序如下学生成绩名次表流程图编写程序如下CRLF MACROAMOV AH,02H AS MOV DL,0DH INT 21H MOV AH,02H MOV DL,0AH INT 21H ENDMDATA SEGMENTSTUNUM EQU 30MESS1 DB 'PLEASE INPUT THE 30 SCORE '0DH,0AH,'$'ERROR DB 'ERROR!',0DH,0AH,'$'MESS2 DB 'THE ORDER :'0DH,0AH ,'$'EMARK DBORG 1000HSCORE DB 30 DUP()ORG 2000HSEQU DB 30 DUP()DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATA ;程序初始化MOV DS,AXMOV ES,AXMOV AH,09HMOV DX,OFFSET MESS1INT 21H ; 9号功能调用,显示提示信息 MOV SI,OFFSET SCORE ; 成绩表首址赋给SIMOV CX,STUNUM ;学生数送CXMOV EMARK,0UUU: CALL GETNUM ;读取键入成绩值送DXCMP EMARK,01H ;如果输入不符合要求则重新输入 JZ STARTMOV [SI],DL ; 存入成绩表缓冲区中INC SI ;指向下一单元LOOP UUUMOV CX,STUNUM ;学生数MOV DI,OFFSET SEQU ;名次表首地址赋给DIVVV: CALL SCAN ;扫描子程序MOV AL,STUNUM ;学生数送给ALSUB AL,CLINC AL ;计算名次,并把名次赋给AL MOV BX,DXMOV [DI+BX],AL ;把名次再赋给对应的DX学号 LOOP VVV ;MOV AH,09HLEA DX,MESS2INT 21HMOV CX,STUNUM ;学生数赋给CXMOV SI,OFFSET SEQU ;名次表首地址赋给SIWWW: MOV AL,[SI]CALL DISPIPUSH DXMOV AH,02MOV DL,20HINT 21HPOP AXPOP DXI NC SILOOP WWW ;显示排定的学生名次MOV AX,4CHINT 21HSCAN PROC NEAR ;子程序,每扫描一遍成绩表缓冲区, 找出其成绩最高者 ;(由DX指针指示对应学生),之后将该成绩清除以便下一次扫描 PUSH CXMOV CX,STUNUM ;学生数MOV AL,00H ;最低成绩MOV BX,OFFSET SCOREMOV SI,BX ;指向成绩表首址CCC: CMP AL,[SI]JAE JJJ ;AL中的成绩不低于成绩表指针SI所指单元的成绩则转JJJMOV AL,[SI] ;AL存放较高的成绩MOV DX,SISUB DX,BX ;DX为对应学号JJJ: INC SI ;指向下一单元LOOP CCCADD BX,DXMOV BYTE PTR [BX],00H ;本次扫描成绩最高者清0,以便后面的比较POP CXRETSCAN ENDPDISPI PROC NEAR ;显示子程序PUSH CXMOV BL,ALMOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPLMOV DL,BLAND DL,0FHCALL DISPLPOP CXRETDISPI ENDPDISPL PROC NEARCMP DL,3AHJB DDDADD DL,27HDDD: MOV AH,02HINT 21HRETDISPL ENDPGETNUM PROC NEAR ;键读入子程序 PUSH CXXOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DHJZ PPPSUB AL,30HJB KKKCMP AL,09HJBE GETSJMP KKKGETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: MOV AH,09HMOV DX,OFFSET ERROR ;显示错误INT 21HMOV EMARK,01HPPP: PUSH DXCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START结果:三,心得体会经过这一周的微机原理课程设计的磨练,首先让我认识到自己的不足,对编程的生疏,思路的限制,知道自己还有很多不懂的地方,还有很大的发展的余地,当然正因为如此我也成为了一名受益者,让自己得到了一个星期的锻炼,对CMD命令提示符这个编程有了更多的认识。

在这一个星期中,可以说是苦大于甜,这些程序题目都像一座座大山在我的前面,我必须很努力的去克服这些困难,通过在网上搜集资料以及去询问同学,我也渐渐的克服了这些。

下面我就一个一个程序的来叙述一下我这个星期的成果吧首先第一个程序是字符串的匹配设计,思路是:字符串的输入是用9号功能调用,但是要注意的是必须以‘$’作为结束符,否则运行结果是乱码,我就是遇到乱码的,后来询问同学以及查看书籍知道了这个很重要的一点,然后既然是匹配,那肯定是两个相等长度的字符串的比较了,如果是两个长度不等的字符串那么就可以直接输出’NO MATCH’,然后一个一个的字符进行比较,如果相等则比较下一个,如果不相等,则直接输出‘ NO MATCH’,知道每一个字符都相等那么输出‘ MATCH’,则可以得出编写此程序得到‘MATCH’结果的要求是1、两个字符串长度必须相等2、相对应的每一个字符都必须相等。

程序的运行结果第二个程序是从键盘输入数据并显示的设计。

大概思路:从键盘接受到四位十六进制,首先要判断接收到的是不是符合要求,是不是在0-F中,则要先判断,如果是则进行下面的步骤,如果是回车或者空格则结束程序,如果不是则显示‘ERROR!’,其次输出二进制是一位一位的显示,我们可以把四位十六进制数放在BX中,让它循环左移一位,并且取二进制的第八位,让高七位置零,显示最低位加上30H的对应ASCII表中的数字,如此循环16次,就可以把四位十六进制对应的16位二进制输出。

当然在期间遇到了困难,比如最初没有想到要判断输入是否正确,整个重心只在如何输出,所以在运行时出现了困难,还有不懂2号功能调用后键入的值去哪里了,不知道下面应该怎么写,后来知道是赋给了AL了。

下面程序运行的结果:第三个程序是响铃设计,大概的思路是:首先要键入一个数,用的是1号功能调用,我们采用的是输入一个数的ASCII码,因为这样方便比较,则如果在‘30H-39H’则可以运行下面的程序,如果是回车0DH,或者空格20H则退出程序,不是的话则重新输入,然后讲ASCII码减去2FH则作为响铃的次数,响铃中比较重要的一点是延时,在两次响铃中间有延时,这样才能更加的清楚,为此我们采用在每两次响铃之间进行CX的自循环,设CX=0FFFFH,然后让它循环减1直到为0了则可以进行第二次响铃了,则完成了两次响铃之间的一个延时,响铃的次数由键入的数决定。

在程序设计过程中也遇到了困难,比如刚开始我不知道响铃是用什么来实现的,后来询问同学和查询资料后知道响铃是用MOV AH,02HMOV DL,07H INT 21H 来实现的,增长了我的知识。

其次不知道延时是什么东西,后来在参考资料时时发现了原来是用CX的自循环来实现的,很巧妙的一种方法。

第四个程序是将键盘输入的小写字母转换为大写字母,大概的思路是这样的:首先用1号功能调用接受从键盘输入的字母,然后要判断是否是小写字母,,如果键入为回车0DH,,则退出程序20H如果键入值的ASCII码小于61H,及不是小写字母,则重新输入,如果是小写字母,则将小写字母的ASCII码减去20H,转换为对应大写字母的ASCII码按回车后变成第五个程序是学生成绩名次表的设计,大概的思路是:首先要设置数据段放30个学生的成绩,还有30个学生的排名。

然后调用GETNUM来接受键入的成绩,首先在GETNUM中要判断成绩输入的形式是否正确,如果ASCII码小于30H及小于0了,就显示出错重新输入,如果输入在0-9之间则将输入的值放入DX的高四位,然后在将紧接着的一个数字存到DX的低四位,也就是将一个人的成绩存放到DX中去,然后将DL存到对应数据段存放成绩的位置因为题目的给定,所以存放的首地址是1000H,知道取满30个为止,然后开始判断成绩的高低了,可以首先假设一个AL=00H,然后将学生的成绩与之进行比较,用循环,设CX初值是30,每次将AL与全部其他的比完后减1,如果比AL大的话,就取代AL,并且判断下一个,如果比AL小的话就直接判断下一个,直到30个全部比完为止,将最大的成绩的学号(即对应地址减去首地址得到的数),并将最高成绩清零,是为了下面的比较,将学生总数30减去CX,就是该学生的成绩名次。

然后将学生的名次存入相应名次表中对应学号位置处。

直到全部30个名次全部存完。

然后将名次表输出。

就可以得到每个人的相应的名次了。

当然还遇到了一些困难,就是思路不清晰,不知道具体该怎么做,后来知道名次表和成绩表用不同的数据段来表示,这样就不会混淆了,还有很重要的一点就是不知道比较完一次之后要把最高的那个成绩置零,导致结果出错,后来在参考资料下知道了这一点。

相关主题