汇编语言课程论文.docx
《汇编语言课程论文.docx》由会员分享,可在线阅读,更多相关《汇编语言课程论文.docx(13页珍藏版)》请在冰点文库上搜索。
汇编语言课程论文
汇编语言程序设计
摘要
汇编语言是面向机器的程序设计语言。
在汇编语合中,用助记符代替操作码,用地址符号或标号代替地址码。
这样用指令的助记符、符号地址、标号、伪指令等符号代替机器语言的二进制码,就把机器语言变成了汇编语言。
于是汇编语言亦称为符号语言。
使用汇编语言编写的程序,机器不能直接识别,要由一种程序将汇编语言翻译成机器语言,这种起翻译作用的程序叫汇编程序,汇编程序是系统软件中语言处理系统软件。
汇编程序把汇编语言翻译成机器上能执行的机器语言的过程称为汇编。
[关键词]:
汇编语言、程序设计、指令系统
第1章汇编语言概况
汇编语言是一种功能很强的程序设计语言,也是利用计算机所有硬件特性并能直接控制硬件的语言。
汇编语言,作为一门语言,对应于高级语言的编译器,需要一个“汇编器”来把汇编语言原文件汇编成机器可执行的代码。
高级的汇编器如MASM,TASM等等为我们写汇编程序提供了很多类似于高级语言的特征,比如结构化、抽象等。
在这样的环境中编写的汇编程序,有很大一部分是面向汇编器的伪指令,已经类同于高级语言。
现在的汇编环境已经如此高级,即使全部用汇编语言来编写windows的应用程序也是可行的,但这不是汇编语言的长处。
汇编语言的长处在于编写高效且需要对机器硬件精确控制的程序。
大多数情况下Linux程序员不需要使用汇编语言,因为即便是硬件驱动这样的底层程序在Linux操作系统中也可以用完全用C语言来实现,再加上GCC这一优秀的编译器目前已经能够对最终生成的代码进行很好的优化,的确有足够的理由让我们可以暂时将汇编语言抛在一边了。
但实际情况是Linux程序员有时还是需要使用汇编,或者不得不使用汇编,理由很简单:
精简、高效和libc无关性。
假设要移植Linux到某一特定的嵌入式硬件环境下,首先必然面临如何减少系统大小、提高执行效率等问题,此时或许只有汇编语言能帮上忙了。
第2章汇编语言的基本元素
2.1汇编语言的语句格式
由汇编语言编写的源程序是由许多语句(也可称为汇编指令)组成的。
每个语句由1~4个部分组成,其格式是:
[标识符]指令助记符[操作数][;注解]
其中用方括号括起来的部分可有可无。
每部分之间用空格(至少一个)分开,一行最多可有132个字符。
2.2汇编语言的运算符
1.算术运算符、逻辑运算符和关系运算符
算术运算符可以应用于数字操作数,结果也是数字。
而应用于存储器操作数时,只有+、-运算符有意义。
2.取值运算符SEG、OFFSET、TYPE、SIZE和LENGTH
·SEG和OFFSET分别给出一个变量或标号的段地址和偏移量。
·TYPE操作符返回一个表示存储器操作数类型的数值。
各种存储器地址操作数类型部分的值如表3-1所示。
表3-1存储器操作数的类型属性及返回值
字节
1
字
2
双字
4
NEAR
-1
FAR
-2
·LENGTH和SIZE操作符只应用于数据存储器操作数。
(用DB/DW/DD且用DUP等定义的操作数)
LENGTH返回一个与存储器地址操作数相联系的基本数据个数,
SIZE操作数返回一个为存储器操作数分配的字节数(即单元数)。
3.属性运算符
属性运算符用来给指令中的操作数指定一个临时属性,而暂时忽略当前的属性。
常用的有:
(1)合成运算符PTR
它作用于操作数时,则忽略了操作数当前的类型(字节或字)及属性(NEAR或FAR),而给出一个临时的类型或属性,
一般格式:
类型PTR表达式
功能:
建立一个存储器地址操作数,它与其后的存储器地址操作数有相同的段地址偏移量,但有不同的类型。
例如:
SLOTDW25
此时SLOT已定义成字单元。
若我们想取出它的第一个字节内容,则可用PTR对其作用,使它暂时改变为字节单元。
2.3表达式
是由运算符和操作数组成的序列,在汇编时产生一个确定的值。
这个值可以仅表示一个常量,也可以表示一个存储单元的偏移地址,相应的表达式称为常量表达式和地址表达式。
1.常数
汇编语言语句中出现的常数可以有7种:
①二进制数后跟字母B,如01000001B。
②八进制数后跟字母Q或O,如202Q或202O。
③十进制数后跟D或不跟字母,如85D或85。
④十六进制数后跟H,如56H,0FFH。
注意,当数字的第一个字符是A~F时,在字符前应添加一个数字0,以示和变量的区别。
另有,十进制浮点数、十六进制实数、字符和字符串
2.常量操作数
常量操作数是一个数值操作数,一般是常量或者是表示常量的标识符。
可以为数字常量操作数或字符串常量操作数。
前者可采用二进制、八进制、十进制或十六进制等计数形式;而后者则为相应字符的ASCII码。
3.存储器操作数
存储器操作数是一个地址操作数,代表一个存储单元的地址,通常以标识符的形式出现。
存储器操作数可以分为变量及标号两者类型,如果存储器操作数所代表的是某个数据在数据段、附加段或堆栈段中的地址,那么这个存储器操作数就称为变量;如果存储器操作数所代表的是某条指令代码在码段中的地址,那么这个存储器操作数称为标号。
变量所对应的存储单元内容在程序的运行过程中是可以改变的,标号通常作为转移指令或调用指令的目标操作数,在程序运行过程中不能改变。
存储器操作数有三个方面的属性。
(1)段地址:
即存储器操作数所对应的存储单元所在段的段地址;
(2)偏移地址:
即存储器操作数所对应的存储单元在所在段内的偏移地址;
(3)类型:
变量的类型是相应存储单元所存放的数据项的字节数;而标号的类型则反映了相应存储单元地址在作为转移或调用指令的目标操作数时的寻址方式,可有两种情况,即NEAR和FAR。
4.常量表达式
由常量操作数及运算符构成,在汇编时产生一个常量。
如PORT、VAL十1、OFFSETSUM、SEGSUM、TYPECYCLE等。
5.地址表达式
由存储器操作数与运算符构成,必须有明确的物理意义。
例如SUM+2、CYCLE-5
表达式SUM+2、CYCLE-5的值仍然是一个存储器操作数,该存储器操作数的段地址与类型属性分别与存储器操作数SUM及CYCLE相同,但偏移地址分别比SUM及CYCLE大2或小5。
表达式是在汇编时计算的,而变量单元的内容在程序的运行过程中可以改变。
2.4汇编语言程序汇编步骤
1.编写源程序
在弄规定,逐个模块地编写汇编语言源程序。
通常使用编辑软件(例如:
EDLIN、EDIT或其他软件),将源程序输入到计算机中。
汇编语言源程序的扩展名为.ASM。
2.汇编
利用汇编程序(或宏汇编程序)(ASM或MASM)对汇编语言源程序进行汇编,产生扩展名为.OBJ的可重定位的目的代码。
同时,如果需要,宏汇编还可以产生扩展名为.LST的列表文件和扩展名为.CRF的交叉参考文件。
前者列出汇编产生的目的代码及与之有关的地址、源语句和符号表;后者再经CREF文件处理可得各定义符号与源程序行号的对应清单。
在对源程序进行汇编过程中,汇编程序会对源程序中的非逻辑性错误给出显示,例如,源程序中使用了非法指令、标号重复、相对转移超出转移范围等等。
利用这些提示,设计者需修改源程序,以消除这些语法上的错误。
程序设计者在改正源程序中的错误过程中,重新编辑源程序,形成新的.ASM文件。
然后重新汇编,直到汇编程序显示无错误为止。
3.连接
利用连接程序(LINK)可将一个或多个.OBJ文件进行连接,生成扩展名为.EXE的可执行文件。
在连接过程中,LINK同样会给出错误提示。
设计者应根据错误提示,分析发生错误的原因,并修改源程序,然后重复前面的过程——汇编、连接,最后得到.EXE可执行文件。
4.调试
对于稍大一些的程序来说,经过上述步骤所获得的.EXE文件,在运行过程中难免无错。
也就是说,前面只能发现一些明显的语法上的错误。
而对程序的逻辑错、能否达到预期的功能均无法得知。
因此,必须对可执行文件(.EXE文件)进行调试。
通过调试来证明程序确实能达到预期的功能且没有漏洞。
程序调试通过则可进入试运行。
在试运行过程中不断进行观察、测试,发现问题及时解决,最后完成软件设计。
第3章伪指令
伪指令用来对汇编程序进行控制,对程序中的数据实现条件转移、列表、存储空间分配等处理,其格式和汇编指令一样,但一般不产生目的代码,即不直接命令CPU去执行什么操作。
3.1定义数据伪指令
该类伪指令用来定义存储空间及其所存数据的长度。
·DB:
定义字节,即每个数据是1个字节。
·DW:
定义字,即每个数据占1个字(2个字节)。
·DD:
定义双字,即每个数据占2个字。
低字在低地址,高字在高地址。
·DQ:
定义4字长,即每个数据占4个字。
·DT:
定义10个字节长,用于压缩式十进制数。
3.2符号定义伪指令EQU、=、及PURGE
·EQU伪指令给符号定义一个值。
在程序中,凡是出现该符号的地方,汇编时均用其值代替。
3.3段定义伪指令SEGMENT和ENDS
一般来说,一个完整的汇编源程序由3个段组成,即堆栈段、数据段和代码段。
段定义伪指令可将源程序划分成若干段,以便生成目的代码和连接时将各同名段进行组合。
段定义伪指令一般格式为:
段名SEGMENT[定位类型][组合类型][类别]
段名ENDS
SEGMENT和END5应成对使用,缺—不可。
其中段名是不可省略的。
其它是可选项,是赋予段名的属性,可以省略。
3.4设定段寄存器伪指令ASSUME
一般格式:
ASSUME段寄存器:
段名[,段寄存器:
段名,……]
功能:
通知汇编程序,哪一个段寄存器是该段的段寄存器,以便对使用变量或标号的指令汇编出正确的目的代码。
3.5定义过程的伪指令PROC和ENDP
在程序设计中,可将具有一定功能的程序段看成为一个过程(相当于一个子程序),它可以被别的程序调用。
要求先定义后使用。
一个过程由伪指令PROC和ENDP来定义,其格式为:
过程名PROC[类型]
过程体RET
过程名ENDP
其中过程名是为过程所起的名称,不能省略,过程的类型由FAR(远过程,为段间调用)和NEAR(近过程,在本段内调用)来确定,如果缺省类型,则该过程就默认为近过程。
ENDP表示过程结束。
过程体内至少应有一条RET指令,以便返回被调用处。
过程可以嵌套,也可以递归使用。
3.6宏指令
在汇编语言书写的源程序中,若有的程序段要多次使用,为了简化程序书写,该程序段可以用一条宏指令来代替,而汇编程序汇编到该宏指令时,仍会产生源程序所需的代码。
3.7ORG伪指令
ORG伪指令规定了在某一段内,程序或数据代码存放的起始偏移地址。
一般格式:
ORG<表达式>
3.8汇编结束伪指令END
该伪指令表示源程序的结束.令汇编程序停止汇编。
因此,任何一个完整的源程序均应有END指令。
一般格式:
END[表达式]
其中表达式表示该汇编程序的启动地址。
例如:
ENDSTART;表明该程序的启动地址为START。
第4章汇编程序设计
4.1简单程序设计
简单程序设计是没有分支,没有循环的直线运行程序,程序执行按照IP内容自动增加的顺序进行。
4.2分支程序设计
分支程序的基本思想是根据逻辑判断的结果来形成程序的分支,如图,若A成立,则执行P1;否则执行P2。
4.3循环程序设计
循环程序是经常遇到的程序结构,一个循环结构通常由以下几个部分组成。
图3-4循环结构示意图
1.循环初始化部分。
一般要进行地址指针、循环次数及某标志的设置,相关寄存器的清零等操作。
只有正确地进行了初始化设置,循环程序才能正确运行,及时停止。
2.循环体。
是要求重复执行的程序段部分,对应于要求重复执行的操作。
3.循环控制部分。
由该部分修改并判断控制循环的条件是否满足。
以决定是否继续循环。
4.循环结束部分。
如保存循环运行结果等。
循环程序有两种结构形式,一种是DO—WHILE结构,另一种是DO—UNTIL结构。
前者把循环控制部分放在循环体的前面,先判断执行循环体的条件,满足条件就执行循环体,否则就退出循环,如图3-4
(2)所示。
而后者则是在执行循环体之后,再判断循环控制条件是否满足,若满足条件,则继续执行循环操作,否则,则退出循环。
如图3-4
(1)所示。
DO—WHILE结构的循环程序,其循环体有可能并不执行,而DO—UNTIL循环程序的循环体至少必须执行一次。
4.4子程序设计
子程序是程序设计中经常使用的程序结构,通过把一些固定的、经常使用的功能做成子程序的形式,可以使源程序及目标程序大大缩短,提高程序设计的效率和可靠性。
对于一个子程序,应该注意它的入口参数和出口参数。
入口参数是由主程序传给子程序的参数,而出口参数是子程序运算完传给主程序的结果。
另外,子程序所使用的寄存器和存储单元往往需要保护,以免影响返回后主程序的运行。
主程序在调用子程序时,一方面初始数据要传给子程序,另一方面子程序运行结果要传给主程序,因此,主子程序之间的参数传递是非常重要的。
第5章汇编语言的优点与缺点
1.优点
汇编语言直接同计算机的底层软件甚至硬件进行交互,它具有如下一些优点:
(1)能够直接访问与硬件相关的存储器或I/O端口;
(2)能够不受编译器的限制,对生成的二进制代码进行完全的控制;
(3)能够对关键代码进行更准确的控制,避免因线程共同访问或者硬件设备共享引起的死锁;
(4)能够根据特定的应用对代码做最佳的优化,提高运行速度;
(5)能够最大限度地发挥硬件的功能。
2.缺点
同时还应该认识到,汇编语言是一种层次非常低的语言,它仅仅高于直接手工编写二进制的机器指令码,因此不可避免地存在一些缺点:
(1)编写的代码非常难懂,不好维护;
(2)很容易产生bug,难于调试;
(3)只能针对特定的体系结构和处理器进行优化;
(4)开发效率很低,时间长且单调。
第6章汇编语言的特点
汇编语言比机器语言易于读写、调试和修改,同时具有机器语言全部优点。
但在编写复杂程序时,相对高级语言代码量较大,而且汇编语言依赖于具体的处理器体系结构,不能通用,因此不能直接在不同处理器体系结构之间移植。
汇编语言的特点:
1.面向机器的低级语言,通常是为特定的计算机或系列计算机专门设计的。
2.保持了机器语言的优点,具有直接和简捷的特点。
3.可有效地访问、控制计算机的各种硬件设备,如磁盘、存储器、CPU、I/O端口等。
4.目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。
5.经常与高级语言配合使用,应用十分广泛。
对于不同型号的计算机,有着不同的结构的汇编语言,汇编语言由于采用了助记符号来编写程序,比用机器语言的二进制代码编程要方便些,在一定程度上简化了编程过程。
汇编语言的特点是用符号代替了机器指令代码,而且助记符与指令代码一一对应,基本保留了机器语言的灵活性。
使用汇编语言能面向机器并较好地发挥机器的特性,得到质量较高的程序。
汇编语言是面向具体机型的,它离不开具体计算机的指令系统,因此,对于不同型号的计算机,有着不同的结构的汇编语言,而且,对于同一问题所编制的汇编语言程序在不同种类的计算机间是互不相通的。
汇编语言中由于使用了助记符号,用汇编语言编制的程序输入计算机,计算机不能象用机器语言编写的程序一样直接识别和执行,必须通过预先放入计算机的"汇编程序"中进行加工和翻译,才能变成能够被计算机直接识别和处理的二进制代码程序。
用汇编语言等非机器语言书写好的符号程序称为源程序,运行时汇编程序要将源程序翻译成目标程序。
目标程序是机器语言程序,当它被安置在内存的预定位置上,就能被计算机的CPU处理和执行。
汇编语言像机器指令一样,是硬件操作的控制信息,因而仍然是面向机器的语言,使用起来还是比较繁琐费时,通用性也差。
但是,汇编语言用来编制系统软件和过程控制软件,其目标程序占用内存空间少,运行速度快,有着高级语言不可替代的用途。
第7章汇编语言的应用
汇编语言作为最基本的编程语言之一,汇编语言虽然应用的范围不算很广,但重要性却勿庸置疑,因为它能够完成许多其它语言所无法完成的功能。
就拿Linux内核来讲,虽然绝大部分代码是用C语言编写的,但仍然不可避免地在某些关键地方使用了汇编代码,其中主要是在Linux的启动部分。
由于这部分代码与硬件的关系非常密切,即使是C语言也会有些力不从心,而汇编语言则能够很好扬长避短,最大限度地发挥硬件的性能。
1.70%以上的系统软件是用汇编语言编写的。
2.某些快速处理、位处理、访问硬件设备等高效程序是用汇编语言编写的。
3.某些高级绘图程序、视频游戏程序是用汇编语言编写的。
汇编语言是理解整个计算机系统的最佳起点和最有效途径,人们经常认为汇编语言的应用范围很小,而忽视它的重要性。
其实汇编语言对每一个希望学习计算机科学与技术的人来说都是非常重要的,是不能不学习的语言。
所有可编程计算机都向人们提供机器指令,通过机器指令人们能够使用机器的逻辑功能。
所有程序,不论用何种语言编制,都必须转成机器指令,运用机器的逻辑功能,其功能才能得以实现。
机器的逻辑功能,软件系统功能构筑其上,硬件系统功能运行于下。
汇编语言直接描述机器指令,比机器指令容易记忆和理解。
通过学习和使用汇编语言,能够感知、体会、理解机器的逻辑功能,向上为理解各种软件系统的原理,打下技术理论基础;向下为掌握硬件系统的原理,打下实践应用基础。
学习汇编语言,向上可以理解软件,向下能够感知硬件,是我们理解整个计算机系统的最佳起点。
总结
刚刚接触汇编的时候甚至分不清寄存器和存储器,也不明白什么是操作数,前几章学习指令的时候简直是云里雾里,为指令改错更是生搬硬套,看见两个中括号就说它错了,7种寻址方式求有效地址,给什么就加什么,也不知道为什么,知道前几天才突然发现那些跳转指令其实都是英文缩写,以前每次用到跳转的时候都要查表,什么都不记得,现在知道CLC就是clearCF,STC就是setCF,以此类推就什么都记住了,还有MOVAX,OFFSETARR[BX][SI]为什么是错的,而LEAAX,ARR[BX][SI]就是对的,因为OFFSET是一个伪操作符,而LEA是计算机指令,不需要在汇编时计算,在汇编的时候,汇编程序知道ARR的地址是多少,但不能知道BX和SI的值是多少,所以不能得到ARR[BX][SI]的地址。
这些都是在复习的时候和同学讨论研究出来的,可见一个人的学习效率往往不如几个同学一起讨论,学习的过程中更需要有人提点。
参考文献
微型计算机原理及应用(第二版)候晓霞编著化学工业出版社
致谢词
温老师渊博的专业知识,严谨的治学态度,精益求精的工作作风,诲人不倦的高尚师德,严以律己、宽以待人的崇高风范,朴实无华、平易近人的人格魅力对我影响深远。
不仅使我树立了远大的学术目标、掌握了基本的研究方法,还使我明白了许多待人接物与为人处世的道理。
本论文从选题到完成,每一步都是在老师的指导下完成的,倾注了导师大量的心血。
在此,谨向温老师表示崇高的敬意和衷心的感谢!
感谢温老师平时对我的教育培养,他细心指导我的学习与研究,在此,我要向温老师深深地鞠上一躬。
感谢我的同学这半年来对我学习、生活的关心和帮助。
最后,向我的父亲、母亲、致谢,感谢他们对我的理解与支持。