第三章 汇编语言_第1页
第三章 汇编语言_第2页
第三章 汇编语言_第3页
第三章 汇编语言_第4页
第三章 汇编语言_第5页
已阅读5页,还剩89页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

高等教育出版社,王成端主编,2008.6,汇编语言程序设计(第2版),普通高等教育“十一五”国家级规划教材,本章主要介绍汇编语句中操作数、操作符和运算符,伪指令和部分高级汇编语言,以及汇编语言程序的结构。通过该章的学习,读者结合前面第二章的知识就能编写简单的汇编语言程序。,3.1汇编语言语句3.2伪指令3.3汇编语言程序的结构3.4高级汇编语言技术,第3章汇编语言,3.1汇编语言语句,3.1.1语句的类别与结构1.汇编语句的类别汇编语言源程序由若干语句组成,通常,这些语句可以分为三类,它们是:,1)指令语句,2)宏指令语句,3)伪指令语句,返回本章首页,进入下一节,第3章汇编语言,指令语句,汇编指令是用助记符表示的机器指令,所以这类语句又称机器指令语句,它们由汇编程序汇编成相应的能被CPU直接识别并执行的目标代码,或称机器代码,例如:第二章中介绍过的MOV,SUB,CMP,XOR等指令均属机器指令语句。,返回本章首页,返回本节首页,第3章汇编语言,宏指令语句,在8088/8086和80X86系列的汇编语言中,允许用户为多次重复使用的程序段命一个名字,然后就可以在程序中用这个名字代替该程序段,我们将定义的过程称为宏定义,将该程序段称为宏。宏的定义必须按相应的规定进行,每个宏都有相应的宏名。在程序的任意位置,若需要使用这段程序只要在相应的位置使用宏名,即相当于使用了这段程序。因此,宏指令语句就是宏的引用。宏的引用语句就是宏指令语句。汇编程序遇到宏指令语句时将它还原成一组机器指令。指令语句和宏指令语句都是指令性语句。,返回本章首页,返回本节首页,第3章汇编语言,伪指令语句,伪指令语句是一种指示性语句,这类语句向汇编程序提供汇编过程要求的一些辅助信息,如给变量分配内存单元地址、定义各种符号、实现分段等。,返回本章首页,返回本节首页,第3章汇编语言,伪指令与指令性语句的最大区别是:首先伪指令语句经汇编后不产生任何机器代码,而指令性语句经汇编后会产生相应的机器代码;其次伪指令语句所指示的操作是在程序汇编时就完成了的,而指令性语句的操作必须在程序运行时才能完成。例如,后面我们要介绍的数据定义伪指令DB,DW构成的语句就属于伪指令语句。,伪指令语句与指令性语句的区别,第3章汇编语言,2.汇编语言的语句格式,汇编语言的3类语句可以用以下格式统一表示为:名字项操作项操作数;注释项,第3章汇编语言,其中带方括号的项表示可选项;名字项是用标识符表示的符号;操作项是语句要进行某种操作的助记符;操作数项根据不同的语句,操作数项由零个、一个或者多个表达式组成,并由它提供执行指定操作所需要的操作数或地址,当操作数不止一个时,相互之间应该用逗号隔开;注释项必须以分号开头,主要用来说明程序或重要语句的功能。注释项也可单独出现在程序的任何位置。,语句书写时项与项之间必须用空格或(TAB)符分隔。,第3章汇编语言,(1)名字项在三类语句中,名字项有不同的名称和含义。名字项出现在指令语句或宏指令语句前时,称该名字项为标号且对应的标识符后面必须跟有冒号,标号在汇编以后分配有地址。标号又称为符号地址,可作为转移指令或子程序调用的目标地址。若名字项出现在伪指令语句前,则该名字项称为符号名,根据不同的伪指令,这些符号名又可分为变量名、符号常数名、子程序名或段名等。,第3章汇编语言,名字项的书写有严格的规定,它可使用下列字符:字母AZ、az数字09特殊符号?、-、$等名字项的第一个字符不可以是数字,必须是字母或特殊字符,但是问号本身不能单独作为名字,名字中如果用到,则必须是第一个字符。名字最多由31个字符组成,多则无效。,第3章汇编语言,需要注意的是:名字不能使用汇编语言的专用保留字,寄存器名,8088/8086汇编语言中的指令助记符,伪指令名,表达式中使用的运算符和属性运算符等均不能作为名字项,否则汇编是会给出错误信息;名字项在程序中不能重复定义。,第3章汇编语言,(2)操作项,操作项表示语句要实现的具体操作,可以是指令、宏指令、伪指令的助记符,操作项是汇编语句中不可缺少的部分。汇编程序对上述三类语句会作不同的处理。对指令语句,汇编程序会将它翻译成二进制指令代码;对于宏指令语句,汇编程序将其展开,也就是用宏体替代原来的宏指令语句,并翻译成机器指令;对于伪指令语句,汇编程序会按其指定的伪操作进行处理。,第3章汇编语言,(3)操作数项,操作数项根据不同的语句由一个或多个表达式组成,它给执行的操作提供原始数据并指出结果数据存储的位置。操作数项的常见形式有:常数、寄存器、标号、变量或表达式等。其中,表达式是由常数、变量、标号通过操作数运算符连接而成的式子,需要注意的是:表达式的值是在汇编过程中计算出来的,根据表达式中的成份,计算出来的结果可能是操作数的地址值,也可能就是操作数。两个以上的表达式之间要用逗号分开。,第3章汇编语言,(4)注释项,注释项主要用来说明程序或语句功能,增加程序的可读性。对于较大的程序,注释项更加重要。注释项放在某一语句后,用来说明该语句的功能;注释项放在某一段程序的开头,用来说明下面该段程序的功能。,第3章汇编语言,3.1.2指令语句的操作数,操作数项的常见形式有:常数、寄存器、标号、变量或表达式。,1常数,常数分为数值常数、字符串常数和符号常数。数值常数可以是二、八、十、十六进制数,使用时在这些常数后分别加不同的后缀来区别,我们在第一章中已有所介绍。要说明的一点是,当操作数或地址使用十六进制数表示时,若数的最高位以字母AF开头,则必须在它前面加一个0,以避免和变量、标号或寄存器名相混淆。例如MOVAL,AH与MOVAL,0AH执行的结果是完全不同的,前一指令的源操作数采用寄存器寻址,后一指令的源操作数采用的是立即数寻址。,第3章汇编语言,字符串常数是指用单引号括起来的一个字符或多个字符的序列。使用时可以在单引号内写字符序列,也可以直接在语句中写字符的ASCII码,但ASCII码之间必须用逗号作分隔(此时不需要用单引号)。例如,MOVAH,B指令和MOVAH,42H指令是等价的。,符号常数一般在数据段中用EQU伪指令或“”伪指令定义。程序中可以用符号名代表一个常数或表达式值,以增加程序的可读性。符号常数经常在表达式中使用,也可单独作为操作数出现在语句中。在程序中要注意区分符号常数和变量的不同。,第3章汇编语言,2变量,变量是一个数据存储单元的名字,即数据存放地址的符号表示。变量一般是在除代码段以外的其它段中用伪指令进行定义的,变量经常作为操作数出现在各种语句中,定义变量实际上就是给变量分配内存单元。变量有三种属性:段属性、偏移属性和类型属性。,第3章汇编语言,段属性:表示变量所在段的起始地址。,偏移属性:表示变量在段内的偏移地址,即从段的起始地址开始到变量所对应的内存单元之间的字节数,用16位无符号表示偏移地址。,类型属性:表示该变量能存放的数据长度,它与变量定义时使用的伪指令有关。长度为1个字节的变量,类型为BYTE,长度为2个字节的变量,类型为WORD等。注意:同一个标号或变量的定义在一个程序中只允许一次,否则会出现重复定义错误。,第3章汇编语言,标号一般在代码段中定义,出现在指令语句前面,后面跟冒号(:)与指令操作符分离,它表示指令的符号地址,指示汇编后该指令代码在内存中的位置。它也有三种属性:段属性、偏移属性和类型属性。,3标号,段属性:表示该标号的段起始地址,且该地址一定是在CS段寄存器中。偏移属性:表示标号在代码段中的段内偏移地址,是一个16位的无符号数,表示从段起始地址开始到定义标号的位置之间的距离(字节数)。类型属性:表示该标号是在本段内引用,还是在其它段中引用。在段内引用的标号为NEAR属性,在段外引用的标号为FAR属性。,第3章汇编语言,4表达式,表达式是由常数、变量、标号通过运算符或操作符连接而成的,它可以分为数值表达式和地址表达式。,数值表达式主要由算术运算符、关系运算符和逻辑运算符连接常数组成的有意义的式子,它的运算结果是数值常数,只有大小,没有属性。,地址表达式是由变量、标号、常数、寄存器(BP、BX、SI、DI)的内容()和操作符组成的有意义的式子,它的运算结果不是一个单纯的数值,总是和存储器地址相联系。单个变量、标号、寄存器的内容是地址表达式的特例,第二章介绍的各种存储器寻址方式的汇编表示都属于简单的地址表达式。,第3章汇编语言,3.1.3指令语句中的运算符和操作符,在8086/8088汇编语言中,我们讲数值表达式中进行算术运算的符号称为运算符,为了以示区别我们将地址表达式中的运算符称为操作符。运算符可分为:算术运算符、逻辑运算符、关系运算符;操作符可分为:数值回送操作符和属性操作符。下面介绍各类运算符和操作符及使用方法。,第3章汇编语言,1.运算符,(1)算术运算符算术运算符有+、-、*、/、MOD、右移SHR和左移SHL运算符。其中,+、-、*、/是最常用的运算符,要求参加运算的数(或地址)均为整数,运算的结果也为整数,除法运算的结果是商的整数部分。,第3章汇编语言,(2)逻辑运算符,逻辑运算符依次为NOT,AND,OR和XOR。逻辑运算是按位进行操作的,位与位之间没有进位和借位,其结果认为整数常量。其中,NOT运算符是单操作数运算符,其余三个运算符是双操作数运算符。,第3章汇编语言,(3)关系运算符,关系运算符有六种,它们分别是:EQ相等(Equal)NE不等(Notequal)LT小于(Less)LE小于或等于(LessorEqual)GT大于(Greater)GE大于或等于(GreaterorEqual)它们用于两个表达式值的比较,表达式的值一定是常数或是同一段内的偏移地址,比较的结果为逻辑值,关系成立,结果为真,用全“1”表示,即0FFFFH;关系部成立,结果为假用全“0”表示,即0。,第3章汇编语言,2.操作符,(1)数值回送操作符数值回送操作符有五种,这些操作符的运算对象必须是变量或标号,其运算结果是变量或标号的特征值(类型属性值)或是它们对应的内存单元地址(段基址或段内偏移地址)。下面介绍五种数值回送操作符。,第3章汇编语言,取偏移地址操作符OFFSET,格式:OFFSET变量或标号功能:当OFFSET操作符置于变量或标号前时,汇编程序就自动计算出该变量或标号在它段内的偏移地址。,【例3.1】MOVSI,OFFSETBUF说明:汇编程序将BUF在数据段内的偏移地址作为立即数送到SI中。,第3章汇编语言,取段基址操作符SEG,格式:SEG变量或标号功能:当SEG操作符置于变量或符号前面时,汇编程序就回送变量或标号所在段的段基址。,例:MOVAX,SEGBUF说明:若BUF是从存储器的2000H地址处开始的一个数据段DATA中的变量,则该语句的功能是将变量BUF的段基址2000H作为立即数存放到AX寄存器,第3章汇编语言,取类型操作符TYPR,格式:TYPE变量或标号功能:当TYPE操作符置于变量前面时,汇编程序按TYPE操作符的功能,取得变量的类型数字,该数字表示该变量所分配的存储单元(字节)数:即DB为1,DW为2,DD为4,DT为10。当TYPE操作符置于标号前面时,汇编程序按其功能,返回标号的类型属性值;当该标号为NEAR属性时,返回值为-1,标号为FAR属性时,返回值为-2。,第3章汇编语言,【例3.2】数据段中有如下定义:DATADW75H,134H执行:ADDSI,TYPEDATA该语句在汇编后相当于指令ADDAI,2。,第3章汇编语言,取变量所含的数据存储单元个数操作符LENGTH,格式:LENGTH变量功能:LENGTH操作符只对变量起作用,它的取值根据定义该变量时,数据定义伪指令后面第一个表达式的形式而定。如果第一个表达式为重复子句“nDUP(表达式)”,则返回外层DUP操作符前面的重复因子n;如果为其它形式的表达式,则返回值为1。,第3章汇编语言,【例3.3】DATASEGMENTA1DBABCD,5DUP(0)A2DW10DUP(1),1234HA3DW10,20DUP(?)A4DW5DUP(3DUP(2),5)DATAENDS,MOVAL,LENGTHA1MOVCX,LENGTHA2MOVBX,LENGTHA3MOVDX,LENGTHA4,MOVAL,1MOVCX,10MOVBX,1MOVDX,5,上述四条指令在汇编后相当于指令,第3章汇编语言,取变量所含的数据存储区大小操作符SIZE,格式:SIZE变量功能:SIZE操作符仅对变量起作用,汇编程序用该操作符返回的值表示该变量所分配的总字节数,此数的值是LENGTH变量*TYPE变量。,【例3.4】上例中的A2变量,若想知道它分配的总字节数,可用下述指令表示:MOVCX,SIZEA2汇编后相当于有指令:MOVCX,20即变量A2总共分配有20个字节数。,第3章汇编语言,(2)属性修改操作符,属性修改操作符主要用于临时修改变量、标号或某个内存单元中的操作数的类型属性,它们共有五种:,属性定义操作符PTR,格式:类型PTR地址表达式功能:PTR操作符的作用是将地址表达式的原类型属性临时修改成PTR操作符前面所指定的类型或专门指定某操作数地址的类型。地址表达式的形式可以是标号、变量或是用作地址偏移量的寄存器。指定的类型可以是BYTE、WORD或DWORD。,第3章汇编语言,【例3.5】要将一个立即数20H存入以SI寄存器内容所指定的内存单元,那么SI所指向的单元是字节单元还是字单元,就可以使用PTR操作符加以说明。MOVBYTEPTRSI,20H或MOVWORDPTRSI,20H第一条指令表示将立即数20H送入EASI的字节存储单元;第二条指令表示将立即数20H送入EASI的字存储单元。,注意:PTR操作符只在语句内有效。DUFDB12H,34HMOVAX,WORDPTEDUF上述传送指令的源操作数由于使用了PTR操作符将DAB的类型属性临时修改成WORD类型,因此,执行该指令时是取2个字节的数送给寄存器AX的。执行完MOV指令后,DUF的字节属性并未改变。,第3章汇编语言,SHORT操作符,格式:SHORT标号功能:SHORT操作符用来说明JMP指令中转移地址的属性是短属性,即转移的范围比较小,其转向地址是在JMP的下一条指令地址IP值上加上一个字节的偏移量,即转移范围在(IP)128(IP)127之间。,THIS操作符,格式:THIS属性或类型功能:指定下一个能分配的存储单元的类型。THIS操作符和PTR操作符相似,它可以建立一个指定类型或指定距离的地址操作数。当建立一个指定类型的地址操作数时,该操作数的段基址和段内偏移地址与下一个存储单元地址相同。它常与伪指令EQU或等连用。,第3章汇编语言,例如:NEWTYPEEQUTHISBYTEWORETYPEDW10H,2356H汇编后建立一个新的地址操作数NEWTYPE,它的段基址,段内偏移地址和WORDTYPE相同,但NEWTYPE将紧跟其后的变量WORETYPE重新定义为字节类型的,而WORDTYPE是字类型。根据需要可以选择其中的符号地址,取一个字节的数据用符号地址NEWTYPE,取一个字的数据用符号地址WORDTYPE。,第3章汇编语言,4)HIGH和LOW操作符,格式:HIGT/LOW常数或地址表达式功能:两个操作符都是针对一个16位的数或地址表达式的,其中,HIGH操作符取其高位字节,LOW操作符取其低位字节。例如:CONSTEQU1234HMOVAH,HIGHCONSTMOVAL,LOWCONST上述指令执行后,AH寄存器值为12H,AL寄存器的值为34H。,第3章汇编语言,表3-1运算符的优先顺序,返回本章首页,第3章汇编语言,3.2伪指令,前面我们介绍汇编语言语句除指令语句以外还有伪指令语句和宏指令语句,伪指令又称伪操作,它不像机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,这们可以完成如数据定义、分配存储区、指示程序结束等功能。,进入下一节,返回本章首页,返回上一节,第3章汇编语言,3.2.1数据定义与符号定义伪指令,1.数据定义伪指令格式:变量名数据定义伪指令操作数项表功能:定义以数据存储区,其类型有所使用的数据定义伪指令指定。说明:变量名(Variable)字段是可选项,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序使其记以第一个字节的偏移地址。,第3章汇编语言,数据定义伪指令常用的有以下几种:DB伪指令定义字节类型,其后的每个操作数都占有一个字节。DW伪指令用来定义字类型,其后的每个操作数都占有一个字,即2个字节(低位字节在第一个字节地址中,高位字节在第二个字节地址中)。,DD伪指令用来定义双字类型,其后的每个操作数占有二个字。DQ伪指令用来定义四字类型,其后的每个操作占有四个字。DT伪指令用来定义十字节类型(五个字),其后的每个操作数占有十个字节,形成压缩的BCD码。,第3章汇编语言,操作数字段可以是常数或表达式、字符串、?和带DUP的表达式。若是字符串且是DB类型时,必须以单引号括起来,括起来的字符个数不能超过255个,字符串以ASCII码的形式按地址递增的顺序一次存放在以变量名开始的内存单元中;若是?时,表示伪变量预留内存单元。例如:X1DB?;为变量X1预留1各字节单元若是带DUP的表达式表示定义多个相同的操作数和要预留多个内存单元。,第3章汇编语言,DUP的使用格式如下:表达式DUP(操作数项)表达式为要重复的次数;操作数表示要重复的内容,可以是常数或表达式、字符串、?和带DUP的表达式。例:,A1DB10DUP(ABCD),;表示从A1开始重复定义10个字符串“ABCD”,A2DW4DUP(3,5),;表示从A2开始重复定义4个字“3,5”,A3DB5DUP(3DUP(2),7),;表示从A3开始重复定义5个数据系列“2,2,;2,7”,共占20个字节单元,第3章汇编语言,2.符号定义伪指令,(1)赋值伪指令EQU格式:变量名EQU表达式功能:EQU伪指令将右边表达式的值赋给左边的变量。表达式可以是常数、变量、标号、指令助记符、数值表达式、地址表达式。,第3章汇编语言,当表达式为常数或数值表达式时,赋值伪指令为符号常数定义伪指令,例:COUNTEQU15;定义符号常数COUNT,当表达式为地址表达式时,EQU为地址表达式赋以符号名,例如:A1EQUHEIGHT+12;将EA为HEIGHT+12的地址赋以符号名A1,当表达式为变量、标号或指令助记符时,EQU为已定义的变量名、标号或指令助记符另取一个“别名”。例如:ALPHAEQUCOUNT;为变量COUNT另定义一个别名ALPHABETAEQUBEGIN;为标号BEGIN另定义一个别名BETABEQUBP+8;变址引用赋以符号名BADEQUADD;为指令助记符定义别名AD,第3章汇编语言,注意:在同一源程序中,同一符号不能用EQU伪指令重新定义,例如:NUMEQUDAANUMEQU100H是错误的定义。,第3章汇编语言,2等号伪指令,格式:变量名表达式功能:伪指令与EQU类似,也可以作为赋值操作使用。这们之间的区别是EQU伪指令中的表达式名是不允许重复定义的,而伪指令则允许重复定义;伪指令不能伪指令助记符定义另一别名,EQU可以为指令助记符定义别名。除上述不同外,与EQU的使用时完全相同的。,【例3.6】EMP7EMPEMP+1是正确的,而ADADD是错误的定义。,第3章汇编语言,3定义符号名伪指令LABEL,格式:符号名LABEL类型功能:定义一个标号或变量名,并指定其类型。【例3.7】AB1LABELFARAB2:MOVAL,100上述指令“MOVAL,100”有两个段和偏移量属性相同的标号,即:AB1和AB2,但它们有不同的类型属性,标号AB1为FAR类型,标号AB2为NEAR类型。,第3章汇编语言,3.2.2段定义伪指令,1段定义伪指令段定义伪指令的格式如下:段名SEGMENT定位类型组合类型类别段名ENDS,其中删节号部分,对于数据段、附加段和堆栈段来说,一般是存储单元的定义、分配等伪指令;对于代码段则是指令及伪指令。,第3章汇编语言,定位类型(align_type)可以是:PARA指定段的起始地址必须从小段边界开始,即段起始地址的最低的16进制数位必须为0。BYTE该段可以从任何地址开始。WORD该段必须从字的边界开始,即段起始地址必须为偶数。PAGE该段必须从页的边界开始,即段起始地址的最低两个16进制数位必须为0(该地址能被256整除)。,第3章汇编语言,组合类型(combine_type)可以是:PUBLIC该段连接时将与有相同名字的其他分段连接在一起。其连接次序由连接命令指定。COMMON该段在连接时与其他同名分段有相同的起始地址,所以会产生覆盖。COMMON的连接长度是各分段中最大长度。ATexpression使段的起始地址是表达式所计算出来的16位段地址。但它不能用来指定代码段。STACK指定该段在运行时为堆栈段的一部分。MEMORY指定该将分配在所有其他连接在一起的段的前面(在高地址上),如果连接时有几个指定MEMORY的段,则遇到的第一个段作为MEMORY段,其他段则作为COMMON段。,第3章汇编语言,类别连接时用于组成段组的名字。注意:SEGMENT和ENDS语句必须成对使用。而且在使用时,还可以使用简化的段定义。,【例3.8】;定义一数据段DATADATASEGMENTADB1234BDW12HDATAENDS,第3章汇编语言,2指定段址伪指令,格式:ASSUME段寄存器名:段名,段寄存器名:段名,.功能:ASSUME伪指令设定段和段寄存储器的关系,其中段寄存器名必须是CS、DS、ES和SS中的一个,而段名必须是由SEGMENT定义的段名。ASSUME伪指令只是指定某个段分配给哪一个段寄存器,它并没有把段地址装入段寄存器中,所以一般在代码段伊始,还必须把段地址装入相应的段寄存器中。但是,代码段和堆栈段不需要这样做,寄存器CS,SS是由系统负责设置的。,第3章汇编语言,【例3.9】DATA1SEGMENTDATA1ENDSDATA2SEGMENTDATA2ENDSSTACKSEGMENGSTACKSTACKENDSCODESEGMENTASSUMECS:CODE,DS:DATA1,ES:DATA2,SS:STACKBEGIN:MOVAX,DATA1MOVDS,AXMOVAX,DATA2MOVES,AXCODEENDSENDBEGIN,第3章汇编语言,ASSUMENOTHING可取消前面由ASSUME所指定的段寄存器。例:ASSUMEDS:NOTHING;取消DS与原数据段对应关系ASSUMEDS:DATA3;建立新的对应关系,第3章汇编语言,3.2.3模块定义与通信伪指令,1.模块定义伪指令NAME/END格式:NAME模块名END标号功能:由NAME和END定义一个程序模块。标号为模块执行时程序的起始地址。,第3章汇编语言,说明:,如果程序中没有NAME伪指令,则也可使用TITLE伪指令,其格式为:TITLEtextTITLE伪指令可指定每一页上打印的标题。同时,如果程序中没有使用NAME伪指令,则汇编程序将用text中的前六个字符作为模块名。text最多为60个字符。如果程序既无NAME又无TITLE伪指令,则将用源程序文件名作为模块名。,当NAME缺省时,END只表示源程序结束。,第3章汇编语言,2.模块通信伪指令,(1)定义公共符号名伪指令PUBLIC格式:PUBLIC符号名功能:由PUBLIC定义的符号名,可为其它模块所引用,换句话说,由PUBLIC定义的符号名是公共符号名,可为外部模块引用。说明:符号名可以为变量、符号常量、标号和过程名。例如:PUBLICABC,ALFA,第3章汇编语言,(2)定义外部符号名伪指令EXTRN,格式:EXTRN符号名1:类型,符号名2:类型,符号名3:类型功能:定义本模块中将要引用的外部模块中的符号名,该符号名已在其它模块中被PUBLIC所定义。即由EXTRN伪指令定义的符号名是外部符号名,由外部模块定义而由本模块引用。例如:EXTRNABC:BYTE,第3章汇编语言,3.2.4过程定义伪指令,格式:过程名PROC属性RET过程名ENDP功能:过程定义伪指令用于定义子程序。其中过程名为标识符,它又是子程序入口的符号地址,它的写法与标号的写法相同。属性是指类型属性,它可以是NEAR或FAR段内调用使用NEAR属性,段间调用使用FAR属性。,第3章汇编语言,3.2.5其它伪指令,1EVEN伪指令格式:EVEN功能:使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于字数组为保证其从偶地址开始,可以在它前面用EVEN伪指令来达到这一目的。【例3.10】DATASEGMENTEVENWORDAYDW100DUP(?)DATAENDS,第3章汇编语言,2ORG伪指令,格式:ORG数值表达式功能:ORG伪指令指定在它之后的程序段或数据块所存放的起始地址的偏移量。地址计数器的值可以用$来表示,即可用$来表示当前地址,汇编语言允许用户直接用$来引用当前地址即地址计数器的值,【例3.11】ORG0100H;从偏移地址0100H处开始存放ORG$+8;表示跳过8个字节的存储区,第3章汇编语言,3.3汇编语言程序的结构,3.3.1汇编语言程序的构造汇编语言源程序经汇编、连接后,按照生成不同的可执行程序的形式,可以分为:生成exe可执行程序的源程序格式和生成COM程序的源程序格式两种。,进入下一节,返回本章首页,返回上一节,第3章汇编语言,1exe程序的汇编语言源程序格式,附加段名SEGMENT变量定义数据空间预置附加段名ENDS,一般格式如下:,NAME模块名(可有可无),数据段名SEGMENT变量定义数据空间预置数据段名ENDS,第3章汇编语言,代码段名SEGMENTASSUMECS:代码段名,DS:数据段名,ES:附加段名,SS:堆栈段名Start:指令1指令2指令n代码段名ENDSENDstart,堆栈段名SEGMENTPARASTACKSTACK堆栈段空间预置堆栈段名ENDS,第3章汇编语言,任何一个汇编语言源程序由若干段组成,最多有4个段:数据段、附加段、堆栈段和代码段,前3个段将根据具体程序的需要可有可无,但程序至少有一个代码段。各个段的定义由伪指令SEGMENT和ENDS来完成。,说明:,当有变量定义或预置数据空间时,应在数据段或附加段中进行定义。,如果使用堆栈,用户最好自己设置专用的堆栈空间,也可由系统自行分配堆栈空间。,第3章汇编语言,代码段中,用ASSUME指令指出各段寄存器与当前被使用的逻辑段的对应关系,但并不能把段地址装入相应的寄存器中,所以,在任何程序的开始,都要使用指令给DS、ES赋值:MOVAX,数据段名MOVDS,AS;有数据段时,用这两条命令将数据段首址放入DSMOVAX,附加段名MOVES,AX;有附加数据段时,用这两条命令将其段首址放入ES。,CS是系统在加载程序后由系统自动置入,不能使用如下指令:MOVAX,代码段名MOVCS,AX,第3章汇编语言,2com程序的汇编语言源程序格式,一般格式如下:NAME模块名(可有可无)段名SEGMENTASSUME段寄存器地址说明ORG100HStart:JMPbegin变量定义数据空间预置begin:指令1指令2指令n段名ENDSENDstart,第3章汇编语言,Com程序的源程序形式不允许分段(或者说:只有一个段),程序中用到的数据定义、存储空间预置、堆栈区域以及程序代码均在仅有的一个段内,程序开始运行的起点必须是100H,程序结束使用END。另外,为了符合编程的习惯,将变量定义和数据空间预置(相当于EXE程序格式的数据段)放到了程序的前面并用JMP指令跳过(设置JMP指令是为了保证程序的入口地址100H),读者也可以将其放到后面并去掉JMP指令。,第3章汇编语言,3exe和com程序比较,exe和com程序有如下不同:1)exe程序分为14个段;com程序不允许分段。2)exe程序的入口地址由系统自行安排;com程序的入口地址必须为100H。3)exe程序每个段均可占用64KB的存储空间(段与段也可以重叠使用),一个程序最多可分配256KB的存储空间;com程序所占用的总空间不允许超过64KB。4)exe程序,用户可以设置堆栈也可以不设置;com程序,用户不必设置堆栈,在程序装入时,由系统自动把SP建立在该段之末。,第3章汇编语言,com程序没有exe程序所具有的包括有关文件信息的标题区(header),因此,在64KB之内和exe同样大的程序,com程序的装入速度比exe程序要快。此外,com程序不定期可以直接在调试程序debug中用a或e命令建立,对于一些短小的程序,这也是一种很方便的方法。用户在建立com源程序之后,同样经汇编、连接形成exe程序,然后可以通过exe2bin程序来建立com程序,方法如下:cexe2binexe程序名程序名.com,第3章汇编语言,3.3.2程序正常返回DOS的方法,程序的结束,可用以下4种方法之一返回DOS。功能调用4Ch在程序的代码段结束之前用下面两条命令:MOVAH,4ChINT21H一条INT20H指令用JMP0指令用功能调用00HMOVAH,00HINT21H,第3章汇编语言,【例3.12】将在显示器上显示“HOWAREYOU!”STACKSEGMENTSTACKDB200DUP(0)STACKENDSDATASEGMENTBUFDBHOWAREYOU!DATAENDSCODESEGMENTASSUMECS:CODE,DS:DATA,SS:STACKBEGIN:MOVAX,DATAMOVDS,AXLEADX,BUFMOVAH,9INT21H;DOS功能调用,显示DX指示的缓冲区的数据MOVAH,4CHINT21H;DOS功能调用,结束程序返回DOSCODEENDSENDBEGIN,返回本章首页,第3章汇编语言,3.4高级汇编语言技术,3.4.1条件汇编汇编程序能根据条件把一段源程序包括在汇编语言程序内或者把它排除在外,这里就用到条件伪指令.条件伪指令的一般格式是:IFXX程序段1ELSE程序段2ENDIF,返回本章首页,返回上一节,进入下一节,第3章汇编语言,功能:对程序有选择的进行汇编。汇编时根据条件是否满足,对某段程序进行汇编或不汇编。,说明:表达式的值表示条件,其值可为真(TRUE)或假(FLASE),当它为真时执行程序段1,否则,若有ELSE语句则执行程序段2,若无ELSE语句就跳过ENDIF汇编以下的程序;ELSE及程序段2为可选项。,第3章汇编语言,条件伪指令中的XX表示条件汇编的多种伪操作指令,常用XX有如下几个:,IF表达式汇编程序求出表达式的值,如此值不为0则满足条件,执行程序段1,否则跳过。IFE表达式如求出表达式的值为0则满足条件,执行程序段1,否则跳过。IFDEF符号如符号已在程序中定义,或者已用EXTRN伪指令说明该符号是在外部定义的,则满足条件,执行程序段1,否则跳过。IFNDEF符号如符号未定义或未通过EXTRN说明为外部符号则满足条件,执行程序段1,否则跳过。,第3章汇编语言,IFB如参数为空则满足条件,执行程序段1,否则跳过。IFNB如参数不为空则满足条件,执行程序段1,否则跳过。IFIDN,如果字符串和字符串相同,则满足条件,执行程序段1,否则跳过。IFDIF,如果字符串和字符串不相同,则满足条件执行程序段1,否则跳过。在实际使用时,要根据情况对上述伪指令进行选用。,第3章汇编语言,AEQU40HIFA-40HMOVCL,4SALAL,CLELSEMOVCL,4SARAL,CLENDIFMEQU100IFMGT50D1DB100DUP(?)ELSED2DW100DUP(?)ENDIF,【例3.13】,第3章汇编语言,3.4.2宏汇编,当需要重复执行的程序很短,或需要传送的参数很多时,就可以使用宏汇编语句。“宏”是汇编语言源程序中一段具有独立功能的程序代码,宏的使用是先定义后调用。,第3章汇编语言,1.宏定义与宏调用,(1)宏定义宏指令名MACRO形式参数表宏体ENDM,第3章汇编语言,MACRO和ENDM是一必须成对出现的伪指令。这对伪指令之间的宏体是一组具有独立功能的程序代码。宏指令名给出该宏定义的名称,调用时就使用宏指令名来调用该宏定义。宏指令名可以与伪指令、机器指令的助记符同名,但它具有比机器指令、伪指令更高的优先权。形式参数表可有可无,它给出了该宏定义中所用到的形式参数(或称虚参),每个形式参数之间用逗号隔开。形参个数不限,但字符个数不得超过132个。,说明:,第3章汇编语言,(2)宏调用,经宏定义后的宏指令在源程序中的调用称为宏调用。宏调用的格式是:宏指令名实在参数表说明:宏指令名必须与宏定义中的宏指令名一致;实在参数表

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论