1、3.4小结 14四 程序的调试与运行结果说明 154.1调试程序 154.2运行程序要求 154.3程序运行结果 154.4运行结果说明 174.5小结 17五 课程设计总结 18参考文献 20一 概述汇编语言(AssemblyLanguage)是面向机器的程序设计语言。在汇编语合中,用助记符(Memoni)代替操作码,用地址符号(Symbol)或标号(Label)代替地址码。这样用符号代替机器语言的二进制码,就把机器语言变成了汇编语言。于是汇编语言亦称为符号语言。使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件
2、中语言处理系统软件。汇编程序把汇编语言翻译成机器语言的过程称为汇编。汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。汇编语言的长处在于编写高效且需要对机
3、器硬件精确控制的程序。大多数情况下Linux程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在Linux操作系统中也可以用完全用C语言来实现,再加上GCC这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。但实际情况是Linux程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:精简、高效和libc无关性。假设要移植Linux到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:(1)能够直接
4、访问与硬件相关的存储器或I/O端口;(2)能够不受编译器的限制,对生成的二进制代码进行完全的控制;(3)能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;(4)能够根据特定的应用对代码做最佳的优化,提高运行速度;(5)能够最大限度地发挥硬件的功能。由于汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:(1)编写的代码非常难懂,不好维护;(2)很容易产生bug,难于调试;(3)只能针对特定的体系结构和处理器进行优化;(4)开发效率很低,时间长且单调。汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。但
5、在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同的结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。汇编语言中由于
6、使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的汇编程序的加工和翻译,才能变成能够被计算机识别和处理的二进制代码程序。用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。目标程序是机器语言程序,它一经被安置在内存的预定位置上,就能被计算机的CPU处理和执行。汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。汇编执
7、行指令是机器指令的符号化表示,其操作码用记忆符表示,地址码直接用标号、变量名字、常数等表示。汇编执行指令经汇编程序翻译为机器指令,二者之间基本上保持一一对应的关系。汇编伪指令又称作汇编指示,用于向汇编程序提供用户自定义的符号、数据的类型、数据空间的长度,以及目标程序的格式、存放位置等提示性信息,其作用是指示汇编程序如何进行汇编。由于汇编语言的指令与机器语言的指令大体上保持一一对应的关系,汇编算法采用的基本策略是简单的。通常采用两遍扫描源程序的算法。第一遍扫描源程序根据符号的定义和使用,收集符号的有关信息到符号表中;第二遍利用第一遍收集的符号信息,将源程序中的符号化指令逐条翻译为相应的机器指令。
8、具体的翻译工作可归纳为如下几项:用机器操作码代替符号操作;用数值地址代替符号地址;将常数翻译为机器的内部表示;分配指令和数据所需的存储单元。除了上述的翻译工作外,汇编程序还要考虑:处理伪指令,收集程序中提供的汇编指示信息,并执行相应的功能。为用户提供信息和源程序清单。汇编的善后处理工作,随目标语言的类型不同而有所不同。有的直接启动执行,有的先进行连接装配。如果具有条件汇编、宏汇编或高级汇编功能时,也应进行相应的翻译处理。汇编程序的雏型是在电子离散时序自动计算机 EDSAC上研制成功的。这种系统的特征是用户程序中的指令由单字母指令码、十进制地址和终结字母组成。第一个汇编程序是符号优化汇编程序(S
9、OAP)系统,它是50年代中期为IBM650计算机研制的。这种计算机用磁鼓作存储器,每条指令指出后继指令在磁鼓中的位置。当初研制SOAP系统的动机不是引入汇编语言的符号化特色,而是为了集中解决指令在磁鼓中合理分布的问题,以提高程序的运行效率。IBM704计算机的符号汇编程序(SAP)是汇编程序发展中的一个重要里程碑。此后的汇编程序大都以这一系统为模型,其主要特征至今未发生本质的变化。随着计算机软件的高速发展和广泛应用,汇编程序又吸收了宏加工程序、高级语言翻译程序等系统的一些优点,相继研制出宏汇编程序、高级汇编程序。工作过程:输入汇编语言源程序。检查语法的正确性,如果正确,则将源程序翻译成等价的
10、二进制或浮动二进制的机器语言程序,并根据用户的需要输出源程序和目标程序的对照清单;如果语法有错,则输出错误信息,指明错误的部位、类型和编号。最后,对已汇编出的目标程序进行善后处理。汇编语言作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在Linux的启动部分。由于这部分代码与硬件的关系非常密切,即使是C语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。 图 1-1 Linux 内核
11、1.70%以上的系统软件是用汇编语言编写的。2.某些快速处理、位处理、访问硬件设备等高效程序是用汇编语言编写的。3.某些高级绘图程序、视频游戏程序是用汇编语言编写的。1.1课程设计的目的使我们了解自己掌握知识的深度,运用理论去处理问题的能力,实验能力,课程设计能力,书面及口头表达能力。汇编语言程序设计课程设计是一次大型实验,也是对该课程所学理论知识的深化和提高,因此,要能综合运用所学知识,设计与制造出具有较复杂功能的应用系统,并且在实验基本技能方面有一次全面的训练。通过此次课程设计,使我们具有运用所学知识独立完成汇编程序课题的能力,同时能够较全面地巩固和应用课堂中所学的基本理论和程序方法,能够
12、较熟练地完成汇编语言程序的设计和调试。除了运用专业的知识完成任务,更重要的是使我们意识到对工作要认真负责,一丝不苟,对同学要团结友爱,协作攻关,使我们能够从资料文献,科学实验中获得知识,具备从别人经验中找到解决问题的新途径的悟性,使我们初步具胡工程意识和创新能力。学习勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。1理解和掌握该课程中的有关基本概念,程序设计思想和方法。2培养综合运用所学知识独立完成课题的能力。3培养勇于探索、严谨推理、实事求是、有错必改,用实践来检验理论,全方位考虑问题等科学技术人员应具有的素质。4掌握从资料文献、科学实验中
13、获得知识的能力,提高学生从别人经验中找到解决问题的新途径的悟性,初步培养工程意识和创新能力。5掌握利用单片机接口技术解决问题的基本方法。6掌握和理解对知识的深度、运用理论去处理问题的能力、实验能力、课程设计能力、书面及口头表达能力。1.2课程设计的要求程序中跳出界面窗口提示,在出现的提示信息中输入大写字母“D”或者“d”即显示系统当前日期;输入大写字母“T”或者“t”,可显示系统当前时间;输入大写字母“Q”或者“t”即结束程序,输入错误是显示”INPUT ERROR!”,则重新输入。1查阅相关资料,自学具体课题中涉及到的新知识,能够按照老师的要求对待设计的系统的程序流程图进行正确地绘制。2在老
14、师的指导下,能够写出相应的源程序代码,采用结构化、模块化程序设计方法,功能要完善,界面要美观。3所设计的系统原则上要能够运行无误,结果准确。在条件允许的情况下,能够最终将系统所要实现的功能演示出来。1.3小结通过概述的说明让我们初步了解了这次课程设计的目的和设计的要求,更深的了解了此次的课程设计的意义。并更深入地理解了该课程中的有关基本概念和相关DOS调用功能的使用。使得编写程序时不会像无头苍蝇一样,毫无头绪的去做事情,通过老师的讲解和演示,在自己动手过程中也能正确运用到相应的方法,并使得显示系统日期时间程序设计程序成功运行。二 总体方案设计2.1主要设计思想通过主函数中调用2种宏和2种功能函
15、数分别为调用系统时间的函数和调用系统日期函数来实现全部显示系统时间和日期。功能宏和函数如下:宏1:CLEAR_SCREEN MACRO:它实现了清屏和修改界面属性的功能,使界面更美观。宏2:SHOW MACRO:它实现了显示定义在数据段中的字符串的功能,也就是显示提示语句。函数1:DATEDISPLAY:它实现了显示日期的功能。函数2:TIMEDISPLAY:它实现了显示时间的功能。函数EXIT:函数来退出程序。在程序设计中我承担的是系统时间显示的程序设计,通过被主函数调用来显示系统时间。程序中分别用CH,CL,DH来存放时分秒,来传入并显示系统时间。2.2程序设计思想及流程图运行程序时跳出界
16、面窗口提示,即调用“CLEAR_SCREEN MACRO” 实现清屏和修改界面属性的功能。在界面中会出现的提示信息中,当输入字母“D”或者“d”就调用函数“DATEDISPLAY”即显示系统当前日期;当输入字母“T”或者“t”,就会调用“TIMEDISPLAY”可显示系统当前时间;输入字母“Q”或者“t”就会调用函数“EXIT”即结束程序,输入错误时就会显示”INPUT ERROR!”,则需要重新输入。 图2-1 程序流程图2.3 DATEDISPLAY子程序流程图 “DATEDISPLAY”子程序主要实现对系统日期的显示功能,当用户输入“D”或者“d”时就会进入“DATEDISPLAY”子程
17、序中,调用DOS系统调用功能中2A功能,获取系统日期,将数据保存在CX和DX中, ,取CX中存的系统当前日期,存在AX中,作为被除数,除以10,给各位加上30H,变为它的ASCII码。使存日月的DX入栈,以保护日月。指针指向DATEDIS字符串的最后一位,即年的最后一位,循环4次,将年的ASCII码依次放入字符串 DATEDIS 00-00-0000 的0000位,随后DX出栈还原。取DL中存的日,放入AL中,将高位AH清零,AX作为被除数,重复转换ASCII码的步骤,指针减4,指向字符串 DATEDIS 00 - 00 - 0000的日的第一位,将转换后的日的ASCII码放进00位。接着取D
18、H中的月,重复日的步骤,直到将月放进字符串。然后调用显示宏定义,将转换后的日期显示出来。 图 2-2 DATEDISPLAY子程序流程图2.4 TIMEDISPLAY子程序流程图同“DATEDISPLAY”子程序功能类似, “TIMEDISPLAY”子程序主要实现对系统时间的显示功能,当用户输入字母“T”或者“t”时, 程序进入TIMEDISPLAY PROC NEAR 显示系统时间调用的函数,函数中使用DOS系统功能调用系统时间(“CH”存时,“CL”存分,“DH”存秒),然后做AH的清零操作,将存时“CH”,存分“CL”,存秒“DH”传给AX再做DIV BL商送AX,余数送DX,再将余数转
19、ASCII码的操作后再调用程序中在显示系统时间的宏定义输出系统时间。图 2-3 TIMEDISPLAY子程序流程图2.5小结通过总体方案设计,确定了程序设计的整体思路,主要模块,以及同组员之间负责的功能模块,负责界面设计部分主要对程序提示信息界面设计,包括提示信息的颜色,位置,方式及界面显示属性进行一定的设计,负责清屏和延时功能部分主要对清屏时光标位置的设定,延时时长等进行调整,负责日期和时间的显示主要是对日期和时间数值进行ASCII码转换,最后显示在界面上,完成程序要达到的功能。三 详细设计使用者先根据界面窗口提示信息选择输入大写字母“T”或者“t”时,程序进入TIMEDISPLAY PRO
20、C NEAR 显示系统时间调用的函数,函数中使用DOS系统功能调用系统时间(“CH”存时,“CL”存分,“DH”存秒),然后做AH的清零操作,将存时“CH”,存分“CL”,存秒“DH”传给AX再做DIV BL商送AX,余数送DX,再将余数转ASCII码的操作后再调用程序中在显示系统时间的宏定义输出系统时间。3.1界面程序MAIN PROC FAR MOV AH,00H ;AH=0设置显示模式 MOV AL,03H ;设置80*25图形显示 INT 10H CLEAR_SCREEN 00H,00H,19H,50H MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS
21、,AX SHOW MACRO b ;显示宏定义 LEA DX,b MOV AH,9 INT 21H ENDM SHOW WELCOME ;调用宏定义,显示 字符串的内容 SHOW INF01 SHOW INF02 SHOW INF03 SHOW INF04 SHOW INF053.2系统日期子程序DATEDISPLAY PROC NEAR MOV AH,2AH ;调用DOS取系统日期 INT 21H MOV AX,CX ;将存在CX的年份送入AX,作被除数 MOV BX,10 LEA SI,DATEDIS + 14 MOV CX,4 PUSH DX ;保存月日TAB: XOR DX,DX ;D
22、X做异或运算,做清零操作,存余数 DIV BX ;AX/BX,商送AX,余送DX ADD DL,30H ;余数转ASCII码 MOV SI, DL DEC SI LOOP TAB ;循环4次 POP DX ;DX出栈还原 MOV AL,DL ;将存在DL的日送入AL XOR AH,AH DIV BL ADD AX, 3030H SUB SI, 4 MOV SI, AX MOV AL, DH ;将存在DL的月送入AL XOR AH, AH DIV BL ADD AX, 3030H SUB SI, 5 MOV SI, AX SHOW DATEDIS RETDATEDISPLAY ENDP3.3我完
23、成部分模块说明主要对主程序中的显示系统时间程序的调用和在子程序将数值转换为对应的ASCII码,下面将分别对它们进行简要说明。TIMEDISPLAY PROC NEAR MOV AH,2CH ;调用DOS取系统时间 LEA DI,TIMEDIS DH存时 ADD AX,3030H MOV DI+1,AX MOV AL,CL ;CL存分 MOV DI+6,AX MOV AL, CH ; CH存秒 MOV DI+11,AXSHOW TIMEDIS RET TIMEDISPLAY ENDP “TIMEDISPLAY PROC NEAR ”程序中“INT 21H”功能“2C”能自动提取系统日期,并将“D
24、H”存时,“CL”存分和“CH”存秒, 分别传“AH”中做运算然后将数值转换为ASCII码然后以宏定义中“TIMEDIS”的格式显示输出。3.4小结通过详细设计,完整地设计出程序所调用到的各个子程序,界面显示,显示日期,显示时间,将日期数值转换成ASCII方法,将时间数值转换成ASCII码的方法,包括程序中对运行界面的设计应用等等,在整个程序中,各个部分所应实现的功能都一一实现,最终完成题目所要求的功能,达到设计的最开始的要求:四 程序的调试与运行结果说明4.1调试程序1.编译源文件,命名为test.asm 。2.采用命令格式。masm test.asm将生成一个OBJ文件,检查源程序中的错误
25、,并改正。3.键入连接命令:link test.asm,再次键入test回车,即运行程序。4.2运行程序要求1运行环境 (软、硬件环境):2硬件:8086以上CPU,内存256M以上。3软件:windows 7操作系统,MASM,LINK汇编编译链接软件。4.3程序运行结果起始源程序运行时,界面中会出现的提示信息中,当输入字母“D”或者“d”就调用函数“DATEDISPLAY”即显示系统当前日期;系统时间子程序最先设计时是以“时分秒”的格式显示的。修改前程序运行结果: 图4-1修改前程序运行结果答辩时,根据老师的要求要将显示格式更改成“秒分时”的样式。我把显示系统时间的“CH”存时,“CL”存
26、分,“DH”存秒的先后传入的顺序,即“DH”存秒先传入再传“CL”存分最后再传“CH”存时,不改变之前在宏中定义的显示系统时间的格式。然后保存后重新运行修改后的程序。修改后程序运行结果:图 4-2 修改后程序运行结果4.4运行结果说明当使用者选择输入大写字母“T”或者“t”时,程序使用DOS系统功能调用系统时间(“CH”存时,“CL”存分,“DH”存秒),然后做运算在调用程序中在显示系统时间的宏定义输出系统时间。4.5小结通过对程序的调试和运行,更清楚程序在运行过程中各个寄存器的状态及每个过程中所存储的对象和在此过程中的功能作用等细节同时加深了对汇编语言的理解,编程过程中需要细心,也要多练习编
27、程。五 课程设计总结根据设计要求,这个程序基本实现所要求的功能。但由于短暂的设计时间和过于零散的汇编知识暴露出许多不足之处,如我们显示的时间是静态的,不能动态显示连续的时间,界面太过单调。但是程序也有他相对的特点如冗余低,能判断是否输入错误,和对应的时间和日期的大小写输入。设计要求完成一个显示系统当前日期和时间的汇编程序。即通过输入键盘上某个按键来显示系统的日期和时间或者退出程序。(如:在出现的提示信息中输入大写字母“D”或者“d”即显示系统当前日期;输入大写字母“Q”或者“t”即结束程序。)所以在程序的开始,就已经先定义了清屏上卷宏定义,制定了光标位置。考虑到程序中多次要显示字符串,所以将显
28、示字符串也作为一个宏定义,避免了代码冗长。在整个程序中,只有两个重要子程序,分别为日期显示子程序和时间显示子程序。而在程序编写的过程中我们遇到了许多的问题,如:如何用汇编语言取系统日期和系统时间和怎么显示出来,为了防止代码太冗长,我们选择用宏来显示相应的字符串和界面指令。通过这一次课程设计,使我对汇编语言的基本知识的使用更加熟练,同时也增加了不少我对汇编语言的一些认识,在课程设计完成过程中通过和同学的交流,也增加了合作的技巧,增加自己团队合作的能力。通过查阅资料也学到了一些平时课本上没有的学到的东西,拓宽了自己的知识面,增加了学好汇编语言的信心。也深刻体会到用汇编语言编写代码确实不容易,汇编好几行语句在高级语言里面只需要一条就可以完成,但事物总有两面性存在即具有其合理性,ASM的优越的性能(时间和空间)是高级语言是望尘莫及的。同时我们队各个函数以及语句有了进一步的了解,对各个语句的功能有了更深刻的认识和体会,平时上课的理论知识只是停留在理论的层面,只有通过这样的试验才能更好的体会到,做到理论和
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1