微机原理课程设计电气学院一.课程设计目的:结合微型计算机原理课程的学习,进一步巩固已学的知识,同时针对微型计算机原理知识的具体应用,学会对系统中DOS和BIOS的使用。
学会使用全屏幕编辑程序——PE,弄懂汇编程序的上机过程以及如何运用DEBUG软件进行汇编程序的调试。
二.课程设计的任务:1.字符串匹配的设计:掌握提示信息的设置方法及读取键入信息的方法。
编写程序实现两个字符串比较。
如相同,则显示“MATCH”,否则,显示“NO MATCH”。
2.从键盘输入数据并显示的设计:掌握接收键盘数据的方法,并了解将键盘数据显示时需转换为ASCII码的原理。
编写程序,将键盘接收的到的四位十六进制数据转换为等值的二进制数,再显示在终端上。
3.响铃设计:掌握响铃的使用方法。
编写程序,从键盘接收输入字符,如是数字N,则响铃N次;如不是数字,则不响。
4.将键盘输入的小写字母转换为大写字母:了解小写字母和大写字母在计算机内的表示方法,并学习如何转换。
编写程序,接收键盘字符,并将其中的小写字母转变为大写字母,然后显示在屏幕上。
5.接收年,月,日信息并显示的设计:掌握响铃使用方法,并掌握年,月,日输入方法。
编写程序,先显示“WHAT IS THE DATE(MM/DD/YY)?”并响铃一次,然后接收键盘输入的月/日/年信息,并显示。
在以上几个任务中,我主要研究的是最后一个,年月日的信息显示,下面是程序流程图:三.实验程序:CRLF MACROMOV AH,02H MOV DL,0DH INT 21HMOV AH,02H MOV DL,0AH INT 21HENDM ;宏定义,回车换行 DA TA SEGMENTMESS DB 'what is the date?(MM/DD/YY)',0DH,0AH,'$'MESS1 DB 'month wrong,input again:',0DH,0AH,'$'MESS2 DB 'day wrong,input again:',0DH,0AH,'$'ERROR DB 'input wrong ,input again',0DH,0AH,'$'MARK DB ?REG DW ?DA TA ENDSSTACK SEGMENTSTA DW 32 DUP(?)TOP DW ?STACK ENDSCODE SEGMENTASSUME CS:CODE,DS:DA TA,ES:DA TA,SS:STACKSTART: MOV AX,DA TAMOV DS,AXMOV ES,AXMOV SP,TOP ;程序初始化HEAD: MOV MARK,0 ;清除错误标志MOV AH,09HMOV DX,OFFSET MESSINT 21H ;9号功能调用,显示提示信息MOV AH,02HMOV DL,07HINT 21H ;响铃1次CALL GETNUM ;接收键入的月值CMP MARK,01HJE HEADPUSH DXCALL GETNUM ;接收键入的日值CMP MARK,01HJNE K1POP DXJMP HEADK1: PUSH DXCALL GETNUM ;接收键入的年值CMP MARK,01HJNE K2POP DXPOP DXJMP HEADK2: MOV AX,DXCALL DISP;显示年值NOPMOV AH,02HMOV DL,'-' ;显示`-`INT 21HPOP DX ;将日值送入DXPOP AX ;将月值送入AXPUSH DX ;再将日值压入堆栈,进行保护MOV REG,AXAND AX,00FFH ;判断月值是否正确CMP AX,0012HJBE W1MOV AH,09HLEA DX,MESS1INT 21HJMP STARTW1: MOV AX,REGCALL DISPPMOV AH,02HMOV DL,'-'INT 21HPOP AX ;将日值放入AXMOV REG,AXAND AX,00FFHCMP AX,31H ;判断日值是否正确JBE W2MOV AH,09HLEA DX,MESS2INT 21HJMP STARTW2: MOV AX,REGCALL DISPP ;显示日值MOV AX,4C00HINT 21H ;返回DOSDISPP PROC NEARMOV BL,ALMOV DL,BLMOV CL,04ROL DL,CLAND DL,0FHCALL DISPLMOV DL,BLAND DL,0FHCALL DISPLRETDISPP ENDPDISPL PROC NEARADD DL,30HCMP DL,3AHJB DDDADD DL,07HDDD: MOV AH,02HINT 21HRETDISPL ENDPDISP PROC NEARPUSH BXPUSH CXPUSH DXPUSH AXMOV AL,AHCALL DISPPPOP AXCALL DISPPPOP DXPOP CXPOP BXRET ;显示子程序DISP ENDPGETNUM PROC NEARPUSH CXXOR DX,DXGGG: MOV AH,01HINT 21HCMP AL,0DHJZ PPPCMP AL,20HJZ PPPSUB AL,30HCMP AL,0JB KKKCMP AL,0AHJB GETSJMP KKKGETS: MOV CL,04SHL DX,CLXOR AH,AHADD DX,AXJMP GGGKKK: PUSH AXPUSH DXMOV AH,09HMOV DX,OFFSET ERRORINT 21HMOV MARK,01HPOP DXPOP AXPPP: PUSH DXMOV AH,02HMOV DX,07HINT 21HCRLFPOP DXPOP CXRETGETNUM ENDPCODE ENDSEND START四.心得体会在这短短一周的微机原理课程设计中,通过查阅书籍,上网查找资料,再加上老师和同学的帮助,我完成了老师布置的任务,学到了很多的东西,感觉获益良多。
在这一周里,应该说并不是很轻松,因为以前学到的都是课本上的基础知识,虽然也有上机课程,但是一学期就几节,而且编的只是一些小程序。
而在这段时间,我们的主要任务就是编程,不仅要编出来,还要进行实际的操作运行得出正确的结果,这就让我们将平常所学的理论知识与实践相结合了起来,同时也让我们对DOS系统有了更进一步的了解。
其实,在书上的13个程序中,前九个里除了钢琴设计我没有怎么研究外,别的都或多或少有看过或者与同学讨论过,但最后归总下来,以上的五个程序是我比较了解的,尤其是上面写出的实例,也就是年,月,日的显示设计,我花费了很多时间。
这个程序主要是掌握响铃的使用方法以及年,月,日的输入方法。
响铃比较简单,主要用一个7号功能调用;而年,月,日的输入就让我有些头痛了,需要考虑很多的问题,因为输入的是月,日,年,而显示的是年-月-日这样的信息,开始时我很不理解,不知道从哪里下手,后来通过资料等我采用了堆栈的方法,解决了这个问题,然后就要考虑输入信息的判断问题,首先是输入的是否是数字,然后要考虑输入的数字必须在0~9之间,且要将ASCII码转换为四位十六进制数,然后对四位十六进制数逐位的进行显示,最后注意输入的月份要在1~12之间,日子则要在1~31之间;将以上所有注意点进行联系整编最后才得出了结果。
中间少不了不断进行修改调试的过程,当看到最后运行出正确结果时真的很开心,感觉自己的努力获得了回报。
可能我编的程序有些复杂,因为里面采用了很多的调用,但是总的思路还是比较明朗的,其实我主要就是将它分块了,一个小块代表一个功能,最后整合了一下得出了结果。
总的来说,我觉得我所完成的这五个程序是有共同点的,当中最常用的就是回车换行的调用,9号功能的调用(使字符串在屏幕上输出),1号功能调用(从键盘键入字符),以及0A功能的调用。
对于第一个字符匹配程序主要就是设置字符串缓冲区,9号和0A功能的调用,要先判断两个字符串长度,如不等,则直接显示“NO MA TCH”,相等,再逐个字符进行比较;第二个程序从键盘输入并显示的设计,这个程序我也研究了很久,其主要核心是四位十六进制转换为等值的二进制,当输入数字大于9时,需减7处理,还有就是16位逐个输出;第三个响铃设计,比较简单,需要注意的是延迟时间的设置,输入一个0~9的数字便响铃几次;第四个是大小写字母转换,主要就是与a和z比较,在此范围内就进行转化;我没写在上面的像是排序的设计,主要就是采用了内外循环的语句,用冒泡法得出结果。
我编写程序的过程在老师看来可能有点乱,我是先研究题目需要我们做什么,如果可以的话,可以先把它分开,罗列成一个个小程序,然后试着顺一遍,画出简单的流程图,看自己需要哪些变量与寄存器,最后开始整合,写出框架,具体再细分,全部完成之后进行调试,再一步步完善,当然,在这个过程中向同学讨教了很多,也参阅了很多的资料,但最终还是得到了一个结果。
也学到了一些方法和知识。
这不是第一次编程,但是我觉得这确实是一次系统的历练吧,让我们大家在这一周的时间里不需要上别的什么课程,可以专心致志,心无旁骛的研究微机原理这门课,大家可以互相讨论,发表各自的看法与观点,可以借助于书籍或是网络查找资料,给我们提供了一个很好的学习的机会与平台。
唯一觉得有点不足的是我觉得课程设计的时间有些短,感觉做五个任务有些赶,如果可以的话,真的很希望可以有更多的时间来学习这门课程。
但不管怎样,我还是觉得在这短短一周的学习中我学到了很多!。