(精品)第4章汇编语言程序设计补充.ppt
《(精品)第4章汇编语言程序设计补充.ppt》由会员分享,可在线阅读,更多相关《(精品)第4章汇编语言程序设计补充.ppt(185页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、第 4 章 汇编语言程序设计 1机器语言机器语言(Machine Language)机器语言是一种用二进制表示指令和数据,能被机器直接识别的计算机语言。它的缺点是不直观,不易理解和记忆,因此编写、阅读和修改机器语言程序都比较繁琐。但机器语言程序是计算机惟一能够直接理解和执行的程序,具有执行速度快、占用内存少等特点。2高级语言高级语言(High Level Language)如果说机器语言是面向机器的,那么高级语言(如BASIC,FORTRAN等)则是“面向过程”的语言。利用这些语言编程,程序员可以完全不考虑机器的结构特点,不必了解和熟记机器的指令系统,仅使用一些接近人们书写习惯的英语和数学表达
2、式形式的语句去编制程序。这样编写的程序与问题本身的数学模型之间有着良好的对应关系,可在各种机器上通用(不同机器之间仅做少量修改)。但是,这种用高级语言编写的源程序并不能在机器上直接执行,需要被翻译成对应的目标程序(即机器语言程序),机器才能运行。把具有这种翻译作用的程序称为解释程序或编译程序,见图5.1。图5.1编译程序的功能示意图由于高级语言程序是在未考虑机器的结构特点的条件下编写的,因而它就不能充分利用某种具体CPU所具有的某些特性,而通过编译或解释程序生成的目标程序往往比较冗长,占有较多的内存空间,执行时间也比较长,这就限制了它在某些场合下的运用。例如,实时的数据采集、检测和在线的实时控
3、制等,往往要求程序的目标代码尽可能少占内存并有尽可能快的执行速度,在这些场合下,使用高级语言编写的程序常常不能满足要求。3汇编语言汇编语言(Assembly Language)汇编语言是一种采用助记符表示的程序设计语言,即用助记符来表示指令的操作码和操作数,用标号或符号代表地址、常量或变量。助记符一般都是英文字的缩写,以方便人们书写、阅读和检查。实际上,用汇编语言编写的汇编语言源程序就是机器语言程序的符号表示,汇编语言源程序与其经过汇编所产生的目标代码程序之间有明显的一一对应关系,故也称汇编语言为符号语言。用汇编语言编写程序能够直接利用硬件系统的特性(如寄存器、标志、中断系统等)直接对位、字节
4、、字寄存器或存储单元、I/O端口进行处理,同时也能直接使用CPU指令系统和指令系统提供的各种寻址方式,编制出高质量的程序,这样的程序不但占用内存空间少,而且执行速度快。当然,由于源程序和所要解决的问题的数学模型之间的关系不够直观,使得汇编语言程序设计需要较多的软件开发时间,也增加了程序设计过程中出错的可能性。用汇编语言编写的源程序也需要翻译成目标程序才能被机器执行。这个翻译过程称为汇编,完成汇编任务的程序称为汇编程序,见图5.2。图5.2汇编程序的功能示意图汇编程序是最早也是最成熟的一种系统软件。它除了能够将汇编语言源程序翻译成机器语言程序这一主要功能外,还能够根据用户的要求自动分配存储区域(
5、包括程序区、数据区、暂存区等);自动地把各种进位制数转换成二进制数,把字符转换成ASCII码,计算表达式的值等;自动对源程序进行检查,给出错误信息(如非法格式,未定义的助记符、标号,漏掉操作数等)等。具有这些功能的汇编程序又称为基本汇编(或小汇编ASM)。在基本汇编的基础上,进一步允许在源程序中把一个指令序列定义为一条宏指令的汇编程序,就叫做宏汇编(MASM)。它包含全部ASM功能,还增加了宏指令、结构、记录等高级汇编语言功能。本章讲述:4.1 汇编语言的格式4.2 语句行的构成4.3 指示性语句4.4 指令语句4.5 汇编语言程式设计及举例4.1 汇编语言的格式 4.1.1 8086汇编语言
6、程序的一个例子MY_DATA SEGMENT ;定义数据段SUM DB?;为符号SUM保留一个字节MY_DATA ENDS ;定义数据段结束MY_CODE SEGMENT ;定义码段 ASSUME CS:MY_CODE,;规定CS和DS的内容 DS:MY_DATAPORT_VAL EQU 3 ;端口的符号名GO:MOV AX,MY_DATA ;DS初始化为MY_DATA MOV DS,AX MOV SUM,0 ;清SUM单元CYCLE:CMP SUM,100 ;SUM单元与100相比较 JNA NOT_DONE ;若未超过,转至NOT_DONE MOV AL,SUM ;若超过,把SUM单元的内
7、容 OUT PORT_VAL,AL ;通过AL输出 HLT ;然后停机NOT DONE:IN AL,PORT_VAL ;未超过时,输入下一个字节 ADD SUM,AL ;与以前的结果累加 JMP CYCLE ;转至CYCLEMY CODE ENDS ;码段结束 END GO ;整个程序结束 分段结构分段结构 由上面的例子可以看出,汇编语言源程序的结构是分段结构形式,一个汇编语言源程序由若干段(SEGMENT)组成,每个段以SEGMENT语句开始,以ENDS语句结束。整个源程序的结尾是END语句。这里所说的汇编语言源程序中的段与前面讨论的CPU管理的存储器的段,既有联系,又在概念上有所区别。我们
8、已经知道,微处理器对存储器的管理是分段的,因此,在汇编语言程序中也要求分段组织指令、数据和堆栈,以便将源程序汇编成为目标程序后,可以分别装入存储器的相应段中。但是,以8086/8088CPU为例,它有四个段寄存器(CS,ES,SS和DS),因此CPU对存储器按照四个物理段进行管理,即数据段、附加段、堆栈段和代码段。任何时侯CPU只能访问四个物理段。而在汇编语言源程序中,设置段的自由度比较大。例如,一个源程序中可以有多个数据段或多个代码段等等。一般来说,汇编语言源程序中段的数目可以根据实际需要而设定。为了和CPU管理的存储器物理段相区别,我们将汇编语言程序中的段称为逻辑段。在不致发生混淆的地方,
9、有时简称为段。在上面的简单源程序中只有两个逻辑段,一个逻辑段的名字是DATA,其中存放着与程序有关的数据,称为逻辑数据段;另一个逻辑段的名字是CODE,其中包含着程序的指令,称为逻辑代码段。每个段内均有若干行语句(STATEMENT),因此,可以说一个汇编源程序是由一行一行的语句组成的。下面我们来讨论汇编语言语句的类型和组成。4.1.2 8086汇编语言源程序的格式 8086的汇编语言的源程序是分段的,由若干个段形成一个源程序。源程序的一般格式为:NAME1 SEGMENT 语句 语句 NAME1 ENDS NAME2 SEGMENT 语句 语句 NAME2 ENDS END标号 每一个段有一
10、个名称,以符号SEGMENT作为段的开始,以语句ENDS作为段的结束。这两者都必须有名称,而且名称必须相同。由若干个段组成一个源程序,整个源程序以语句END作为结束。总之,8086的源程序是由若干段组成的,而一个段又是由若干个语句行组成的。所以,语句行是汇编语言源程序的基础。4.2 语句行的构成 语句行是由标记(Token)及分隔符按照一定的规则组织起来的,标记是IBM宏汇编源程序的最小的、有意义的单位。汇编语言语句的类型和格式汇编语言语句的类型和格式 1语句的类型汇编语言源程序中的语句可以分为两种类型:指令语句和伪指令语句。(1)指令语句:它是能产生目标代码,CPU可以执行的能完成特定功能的
11、语句。(2)伪指令语句:它是一种不产生目标代码的语句,它仅仅在汇编过程中告诉汇编程序应如何汇编。例如,告诉汇编程序已写出的汇编语言源程序有几个段,段的名字是什么;定义变量,定义过程,给变量分配存储单元,给数字或表达式命名等。显然,伪指令语句是汇编程序在汇编时使用的。由上例看出8086汇编的一个语句行由以下4个部分组成:标号(或名称)操作码 操作数 ;注释 各部分之间至少要用一个空格作为间隔。IBM宏汇编对于语句行的格式是自由的,但如果写成格式化就便于阅读,建议读者按格式化来写语句行。另外,IBM宏汇编并不要求一个语句只能写一行,一个语句可以有后续行,规定以字符“&”作为后续行的标志。4.2.1
12、 标记 1.IBM宏汇编的字符集 IBM宏汇编中所使用的字符集仅是ASCII和EBCDIC(扩展的BCD码)字符集的一个子集。它由以下几部分组成:(1)字母 包含大写的英文字母:ABCDXYZ;小写的英文字母:abcxyz。(2)数字 阿拉伯数字:0123456789。(3)特殊字符 可打印字符如图4-1中所示。非打印字符有:空格、制表符(TAB键)、回车和换行。若在源程序中包含任何不属于上列字符集中的字符,则汇编程序就把它们作为空格处理。虽然字符“&”是字符集中的一个字符,但紧跟在回车换行之后的符号“&”是代表一个连续行,所以,汇编程序也把它当做空格处理。2.界符(Delimiters)界符
13、是一些特殊字符,利用它们可以表明某个标记的结束,它们本身也有一定的意义,这一点就与分隔符(空格)不同。例子中的冒号(:)、逗号(,)都是一种界符。IBM宏汇编中的界符集如图4-2所示。IBM宏汇编中的界符集语句中有了界符就可以不再用分隔符,但为了程序更清晰可读,有时仍用分隔符。3.常量(Constants)凡是出现在8086源程序中的固定值(它在程序运行期间不会变化),就称为常量。例子中的数0、3、100等都是常量,而且是数字常量。IBM宏汇编中允许的常量为:(1)数字(整数)常量 二进制常量 以字母B结尾的由一串“0”和“1”组成的序列。例如,00101100B。十进制常量 由若干个09的数
14、字组成的序列,可以以字母D作结尾,或没有任何字母作结尾。例如,1234D或1234。八进制常量 以字母Q(或字母O)结尾,由若干个07的数字组成的序列。例如255Q,377Q等。十六进制常量 以字母H结尾,由若干个09的数字或AF的字母所组成的序列。为了避免与标识符相混淆,十六进制数在语句中必须以数字打头。所以,凡是以字母AF开始的十六进制数,必须在前面加上数字0。例如56H,0BA3FH等。(2)字符串常量 字符串常量是由包含在单引号内的1至2个ASCII字符构成的。汇编程序把它们表示成一个字节序列,一个字节对应一个字符,把引号中的字符翻译成它的ASCII码值。例如字符“A”等价于 41H,
15、字符“AB”等价于4142H。在可以使用单字节立即数的地方,就可以使用单个字符组成的字符串常量;在可以使用字立即数的地方,就可以使用两个字符组成的字符串常量。只有在初始化存储器时才可以使用多于两个字符的字符串常量。4.标识符(Identifiers)标识符是由程序员自由建立起来的、有特定意义的字符序列,如例子中的SUM、CYCLE和PORT_VAL等等。一个标识符是由最多为31个字母、数字及规定的特殊字符(?_)等组成的,而且不能用数字打头(以免与十六进制数相混淆)。5.保留字(Reserved words)保留字看上去像标识符,但是它们在语言中有特殊的意义,而且不能用它们作为标识符。如例子中
16、的SEGMENT、MOV、EQU、AL等都是保留字。实际上凡是8086的指令助记符,汇编语言中的命令(伪指令),寄存器名等都是保留字。6.注释(Comment)为了使汇编语言的源程序更便于阅读和理解,常在源程序中加上注释。注释是在分号(;)后面的任意的字符序列,直到行的结尾。在汇编时,汇编程序对它们并不进行处理。在可打印的文件中,注释和源程序一起打印。4.2.2 符号 在汇编语言源程序中,为了使程序更具有普遍性,也便于程序的修改,用户常用符号等代替存储单元、数据、表达式等等,如例中的存储单元SUM、输入输出端口PROT_VAL等就是。符号(Symbol)是一种标识符,它要符合标识符的组成规则。
17、在实际使用中的符号可以分成五类,即寄存器、变量、标号、数、其他。每个符号都具有一定的属性,以允许汇编程序使用它来代表所需的信息。1.寄存器(Registers)8086的寄存器常在操作数场出现,代表某一个操作数。每个寄存器都有一种类型特性,由这些类型可以确定它是一个字节寄存器还是一个字寄存器。8086的标志位被看作是一位寄存器。2.变量(Variable)存放在存储单元中的操作数是变量,因为它们的值是可以改变的。在程序中出现的是存储单元地址的符号,即它们的名称。所有的变量都具有三种属性:(1)段值(SEGMENT),即变量单元所在段的段地址(段的起始地址)的高16位,低4位始终为0;(2)偏移
18、量(OFFSET),即变量单元地址与段的起始地址之间的偏移量(16位);(3)类型(TYPE),变量有三种类型:字节(BYTE)、字(WORD)和双字(DOUBLE WORD)。变量通常是用存储器初始化命令定义的。3.标号(Label)标号是某条指令所存放单元的符号地址,它是转移(条件转移或无条件转移)指令或调用(CALL)指令的目标操作数。对于汇编程序来说,标号与变量是类似的,都是存储单元的符号地址。只是标号对应的存储单元中存放的是指令;而变量所对应的存储单元中存放的是数据。所以,标号也有三种属性:(1)段值,(2)偏移量,(3)类型。标号的类型与变量不同,它的类型是NEAR或是FAR。NE
19、AR是指转移到此标号所指的语句,或调用此子程序或过程,只需要改变IP值,而不改变CS值。也即转移指令或调用指令与此标号所指的语句或过程在同一段内。FAR与NEAR不同,要转移到标号所指的语句,或调用此子程序或过程,不仅需要改变IP的值,而且需要改变CS,即是段交叉转移或调用。若没有对标号进行类型说明,就假定它为NEAR。4.数 在汇编语言源程序中的常数也常以符号的形式出现,这样就更具有通用性,更便于修改。如上例中的就是把端口地址3定义为一个符号PORT_VAL。5.其他符号 除了上述4种符号以外,在汇编语言中还经常出现一些其他符号,把它们用作汇编程序中的伪指令名字。4.2.3 表达式 表达式(
20、Expressions)是由上面讨论过的标记(Token)、符号(Symbol)通过运算符组合起来的。粗略地说,一个表达式是一个由操作数和运算符组合的序列,在汇编时它能产生一个值。1.操作数(Operands)一个操作数可以是一个寄存器名、一个常量(数字常量或字符串常量)或一个存储器操作数。(1)常量操作数 具有数字值的操作数是常量或是表示常量的标识符(符号)。(2)存储器操作数 存储器操作数,通常是标识符,可以分成标号(Label)和变量(Variable)两种。标号是可执行的指令语句的符号地址,通常是作为转移指令JMP和调用指令CALL的目标操作数。变量通常是指存放在一些存储单元中的值,这
21、些值在程序运行过程中是可变的。变量可以具有以下几种寻址方式:直接寻址16位地址偏移量包含在指令中;基址寻址由一个基址寄存器(BX或BP)的内容,加上一个在指令中指定的8位或16位位移量,决定变量的地址;变址寻址由一个变址寄存器(SI或DI)的内容,加上一个在指令中指定的8位或16位位移量,决定变量的地址;基址变址寻址由一个基址寄存器(BX或BP)的内容,加上一个变址寄存器(SI或DI)的内容,再加上一个在指令中指定的8位或16位位移量,决定变量的地址。作为存储器操作数的标号和变量都有三种属性:段值、段内地址偏移量、类型。一个运算符取一个或多个操作数的值,以形成一个新值。在IBM宏汇编中有五种运
22、算符。2.运算符(Operators)IBM宏汇编通常有以下几种运算符:算术运算符(Arithmetic Operators);逻辑运算符(Logical Operators);关系运算符(Relational Operators);分析运算符(Analytic Operators);合成运算符(Synthetic Operators)。(1)算术运算符 这是读者十分熟悉的运算符-+(加)、-(减)、*(乘)、/(除)运算符。另一个算术运算符是MOD(求余),它产生除法以后的余数。因此19/7是2(商是2),而19MOD7是5(余数是5)。算术运算符应用于数字操作数,结果也是数字的。当算术运算
23、符应用于存储器即地址操作数时其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才是有效的。(2)逻辑运算符 按位操作的逻辑运算符有:AND(与)、OR(或)、XOR(异或)和NOT(非)。逻辑运算的操作数只能是数字的,而且结果是数字的。存储器地址操作数不能进行逻辑运算。注意:AND、OR、XOR和NOT,也是8086指令的助记符。但是,作为IBM宏汇编的运算符是在程序汇编时计算的。而作为指令的助记符,则是在程序执行时计算的。(3)关系运算符 在IBM宏汇编中有以下关系运算符:相等 EQ(Equal);不等 NE(Not Equal);小于 LT(Less Than);大于 GT
24、(Greater Than);小于或等于 LE(Less Than or Equal);大于或等于 GE(Greater Than or Equal)。关系运算的两个操作数,或者都是数字的,或者是同一个段的存储器地址。结果始终是一个数字值。若关系是假,则结果为0;若关系是真,则结果为0FFFFH。(4)分析运算符 分析运算符可以把存储器操作数分解为它的组成部分,如它的段值、段内偏移量和类型。(5)合成运算符 合成运算符可以由已经存在的存储器操作数生成一个段值与偏移量相同、而类型不同的新的存储器操作数。4.2.4 语句 如前所述,一个汇编语言的源程序是由一条条语句组成的,语句(Statement
25、s)就是完成一个何种动作的说明。源程序中的语句可分成两类:指令语句,汇编程序把它们翻译成机器代码,这些代码命令8086执行某些操作。如MOV、ADD、JMP等。指示性语句(伪指令),汇编程序并不把它们(也不可能)翻译成机器代码,只是用来指示、引导汇编程序在汇编时进行一些操作,如定义符号、分配存储单元、初始化存储器等等,所以伪指令本身不占用存储单元。两种语句的格式是类似的。指令语句的格式为:标号:助记符 参数,参数 ;注释 指示性语句的格式为:名称 命令 参数,参数 ;注释 在一个指令语句中的标号后面跟有冒号(:),而在一个指示性语句中的名字后面没有冒号,这就是这两种语句在格式上的主要区别。一个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 精品 汇编语言 程序设计 补充
限制150内