1、第4章 8086/8088汇编语言程序设计,汇编语言程序设计是开发微机系统软件的基本功,在程序设计中占有十分重要的地位。,由于汇编语言具有执行速度快和易于实现对硬件的控制等独特的优点,所以至今它仍然是用户使用得较多的程序设计语言。特别是在对于程序的空间和时间要求很高的场合,以及需要直接控制设备的应用场合,汇编语言更是必不可少了。由于汇编语言本身的特点,本章将选择目前国内广泛使用的IBM PC机作为基础机型,着重讨论8086/8088汇编语言的基本语法规则和程序设计的基本方法,以掌握一般汇编语言程序设计的初步技术。,4.1 程序设计语言概述,4.2 8086/8088汇编语言的基本语法,4.3
2、汇编语言程序设计基本方法,4.4 软件调试技术,目录,4.1 程序设计语言概述,程序设计语言是专门为计算机编程所配置的语言。它们按照形式与功能的不同可分为3种,即 :机器语言汇编语言高级语言,目录,一、机器语言(Machine Language),机器语言是由0、1二进制代码书写和存储的指令与数据。特点:能为机器直接识别与执行;程序所占内存空间较少。 缺点:难认、难记、难编写、易出错。,二、汇编语言(Assembly Language),汇编语言是用指令的助记符、符号地址、标号等书写程序的语言,简称符号语言。特点:易读、易写、易记。 缺点:不能像机器语言那样为计算机所直接识别,也不如高级语言那
3、样具有很好的通用性和可移植性。,三、高级语言(High Level Language),高级语言是脱离具体机器(即独立于机器),面向用户的通用语言,不依赖于特定计算机的结构与指令系统。用同一种高级语言编写的源程序,一般可以在不同计算机上运行而获得同一结果。由于高级语言的通用性特点,对于高级语言程序员来说,不必熟悉计算机内部具体结构和机器指令,而只需要把主要精力放在程序结构和算法描述上面。所以,高级语言具有更广泛的领域。,汇编语言程序的上机与处理过程,图中,椭圆表示系统软件及其操作,方框表示磁盘文件。椭圆中横线上部是系统软件的名称,横线下部是软件所作的操作。首先,用户编写汇编语言源文件;再经过汇
4、编程序进行汇编,产生属性为 OBJ的以二进制代码表示的目标程序并存盘。然后通过连接程序(LINK)把目标文件与库文件以及其他目标文件连接在一起,形成可执行文件, 才能在DOS环境下在机器上执行之。,4.2 8086/8088汇编语言的基本语法,各种机器的汇编语言其语法规则不尽相同,但基本语法结构形式类似。现以8086/8088汇编语言为例加以具体讨论。,目录,一、8086/8088汇编源程序实例,在具体讨论8086/8088汇编语言的繁琐语法规则之前,下面先举一个具有完整段定义格式的汇编源程序(即MASM程序)实例, 以便对汇编语言的有关规定和格式有个初步了解。例:求从1开始连续50个奇数之和
5、,并将结果存放在名字为SUM的字存储单元中。,例:求从1开始连续50个奇数之和,并将结果存放在名字为SUM的字存储单元中。,段,汇编源程序一般由若干段组成,每个段都有一个名字(叫段名),以SEGMENT作为段的开始,以ENDS作为段的结束,这两者(伪指令)前面都要冠以相同的名字。,段可以从性质上分为代码段、堆栈段、数据段和附加段4种,但代码段与堆栈段是不可少的,数据段与附加段可根据需要设置。在上面这个例子中,一共定义了3个段:1个数据段1个堆栈段1个代码段,NOTE,每一行只有一条语句且不能超过128个字符(从MASM 6.0开始可以是512个字符)但一条语句允许有后续行,最后均以回车作结束。
6、,NOTE,整个源程序必须以END语句来结束,它通知汇编程序停止汇编。END后面的标号START表示该程序执行时的起始地址。每一条汇编语句最多由4个字段组成,它们均按照一定的规则分别写在一个语句的4个区域内 ,各区域之间用空格或制表符(TAB键)隔开。,二、8086/8088汇编语言语句,(一)汇编语言语句的种类和格式1 语句的种类在8086/8088汇编语言中,有3种基本语句:指令语句伪指令语句宏指令语句,指令语句,是一种执行性语句,它在汇编时,汇编程序将为之产生一一对应的机器目标代码。,汇编指令,机器码,MOV DS,AX ADD AX,BX,8E D8 03 C3,伪指令语句,是一种说明
7、性语句,它在汇编时只为汇编程序提供进行汇编所需要的有关信息,如定义符号,分配存储单元,初始化存储器等,而本身并不代表生成目标代码DATA SEGMENTAA DW 20H,-30HDATA ENDS内存位置:,FF,20,00,D0,宏指令,是以某个宏名字定义的一段指令序列,在汇编时,凡有宏指令出现的地方都将用相应的指令序列的目标代码插入。宏指令语句是一般性指令语句的扩展,2 语句格式8086/8088的汇编语句一般由4个字段组成 如下:,(1)指令语句的格式标号:前缀指令助记符操作数表;注释其中,表示可以任选的部分;操作数表是由逗号分隔开的多个操作数。1)标号标号代表“:”后面的指令所在的存
8、储地址(这里是逻辑地址),供JMP、CALL和LOOP等指令作操作数使用,以寻找转移目标地址。除此之外,它还具有一些其他“属性”。2)前缀8086/8088中有些特殊指令,它们常作为前缀同其他指令配合使用,例如和“串操作指令”(MOVS、CMPS、SCAS、LODS与STOS)连用的5条“重复指令”(REP、REPE/REPZ、REPNE/REPNZ), 以及总线封锁指令LOOK等,都是前缀。,3)指令助记符包括8086/8088的指令助记符,以及用宏定义语句定义过的宏指令名。 4)操作数表对8086/8088的一般性执行指令来说,操作数表可以是一个或两个操作数,若是两个操作数, 则称左边的操
9、作数为目标操作数,右边的操作数为源操作数;对宏指令来说,可能有多个操作数。操作数之间用逗号分隔。 5)注释以“;”开始,用来简要说明该指令在程序中的作用(不是重复解释指令本身的功能),以提高程序的可读性。,(2)伪指令语句的格式名字伪指令参数表;注释其中,“名字”可以是标识符定义的常量名、变量名、过程名、段名以及宏名等。所谓标识符是由字母开头,由字母、数字、特殊字符(如?、下划线、等)组成的字符串。默认情况下,汇编程序是不区分大、小写字母的。注意,名字的后面没有冒号,这是伪指令语句同指令语句在格式上的主要区别。,MASM 中伪操作命令,在伪指令语句的参数表中,包含有用逗号分隔的多个参数,它们可
10、以是常数、变量名、表达式等。 例: SUM DB 12H,23H,34H,45H,56H,67H,78H,89H,(二)指令语句的各个部分:指令语句主要由8086/8088指令系统中的指令组成, 一条指令必须包括一个指令助记符,以及充分的寻址信息,以使汇编程序能将其转换成一条机器指令的操作码字段及由操作数寻址方式指定的操作数字段。,1 标号(Label) (1)标号及其属性标号是为一组机器指令所起的名字,用来作为汇编语言源程序中转移、调用以及循环等指令 的操作数程序转移的转向地址(目标地址)。标号表示指令地址,是指令的符号地址,它具有3种属性段地址、段内偏移量(或相对地址)以及类型。1)段地址
11、(Segment Base)标号所在段的段地址(16位数),是标号所在段的20位起始地址的前16位。,2)段内偏移量(Offset)它是标号与段起始地址之间相距的字节数,为一16位无符号数。3)类型(Type)类型表示该标号所代表的指令的转移范围,分(近)与(远)两种。类型的标号仅在同一段内使用,用字节指针给出转移的偏移量属性(即只改变IP值,不改变CS值);而类型的标号无此限制,必须用字节指针指出转移的段地址与段内偏移量。当标号用作或等指令的目标操作数时,若为段内转移或调用则采用类型;若为段间转移或调用则应当采用类型。JMP FAR PTR LINE,()标号的定义)标号的组成标号用一标识符
12、定义,即以字母开头,由字母、数字、特殊字符(如? 、下划线、等)组成的字符串表示。标号的最大长度一般不超过个字符,除宏指令名外,标号不能与保留字相同。保留字看上去类似标识符,但它们在语言中有被机 器赋于的特殊意义。,寄存器名; 指令系统的全部指令助记符; 汇编语言的伪指令; 其他名字标号最好用具有一定含义的英文单词或单词缩写表示,以便于阅读。, ,)在指令的助记符之前,使用标号并紧跟一个冒号“:”, 表示该标号被定义为一个类型为的标号。当然,标号也可单列一行例如: subrout:mov ax,3000h)标号的使用,通常“标号”只在循环、转移和调用指令中 使用。,例如: JMP SHORT
13、SUBOUT1字节立即数JMP SUBOUT2字节立即数JMP FAR PTR SUBOUT4字节立即数表4.1, 指令助记符 (Instruction Mnemonics)执行性指令中的指令助记符主要为指令系统中指令助记符。 操作数(Operand) 操作数的汇编语言表示法及规则比较复杂,这是因为操作数的表示既要能充分体现出汇编语言中使用符号操作数和指令助记符的优越性,使程序员能尽可能地减少在存储分配和地址计算方面的工作,又要能被汇编程序有效地翻译成对应的特定处理器所具有的各种寻址方式。,()立即操作数立即操作数在指令中直接给出,不需要使用寄存器,也不涉及访问数据区的操作,只能作为源操作数。
14、立即操作数是整数,可以是字节或字节。在汇编语言中,立即操作数用常量(包括数值常量和符号常量)以及由常量与有关运算符组成的数值表达式表示。如:MOV BX,1000+5*3 ()寄存器操作数通用寄存器、以及段寄存器、都可以作为操作数。如:MOV BX,AX,()存储器操作数以指定的存储单元中的内容作为指令的处理对象,汇编指令中的存储器操作数实际上是存储单元的逻辑地址。例 4.3 MOV WORD PTR 0A00H,12ABH例 4.4 MOV AX,BX例 4.5 DEC BYTE PTR BP+12H例 4.6 DEC WORD PTR SI+66例 4.7 DEC WORD PTR BX+
15、DI+50,存储器操作数的段超越:INC BYTE PTRBX+20H与 INC BYTE PTRBP+20HINC BYTE PTR ES:BX+20H与 INC BYTE PTR DS:BP+20HINC BYTE PTR DATA:BP+20H,各种寻址方式下操作数的表达式,()常量与数值表达式)常量是指那些在汇编过程中已经有确定数值的量,它主要用作指令语句中的立即操作数 、变址寻址和基址加变址寻址中的(位移量)或在伪指令语句中用于给变量赋初值。)常量分“数值常量”(也称字面常数)与“符号常量”两种。数值常量:以各种进位制数值形式表示,以后缀字符区分各种进位制,后缀字符表示十六进制,或表
16、示八进制,表示二进制,表示十进制,十进制常省略后缀。,符号常量:预先给常量定义一个“名字”,然后在汇编语句中用该“名字”表示该常量。采用符号常量的优点是改善程序的可读性;如果将符号常量作为程序的参数,则 可方便地实现参数的修改,增强程序的通用性。其定义需用伪操作命令(伪指令)“”或“”。 例: * ,即把送。常量是没有属性的纯数据,其值是在汇编时确定的。,)各种形式的常量格式,4)数值表达式一个能被计算并产生数值的表达式称为数值表达式(Constant Expression)。一个数值表达式可由常量、字符常量以及代表常量或串常量的名字等以算术、逻辑和关系运算符(Operator)连接而成。,1
17、.算数运算符:+,-,*,/,MOD,SHR,SHLMOV AL,18MOD7 ;AL中为余数MOV BL,00111111BMOV AL,BLSHR3 ;00000111B 2.逻辑运算符:AND,OR,XOR,NOTMOV AX,3456HAND1234H 3.关系运算符:EQ,NE,LT,GT,LE,GE条件真,结果为:0FFFFH;否则为0000H。MOV BX,PORT LT 5 ;当PORT小于5,BX=FFFFH,否则BX=0000H。,例4.12: AND AX, (NUMB LT 5)AND 30) OR (NUMB GE 5) AND 20)当时,指令含意为 ,;当时,指令
18、含意为 ,。此例中,操作符与操作数表达式中的具有不同的含意,前者是助记符,后者是伪运算。,()变量与地址表达式)变量及其属性汇编语言中,“变量”()是内存中的一个数据区的名字,即数据所存放地址的符号地址,它可以作为指令中的存储器操作数来引用。由于存储器是分段使用的,因而对源程序中所定义的变量有多种属性。,变量的三种属性:段属性:代表该变量对应数据区所在段的段地址。 偏移值属性:代表该变量与段起始地址的距离。 类型属性:代表存取单位,到底是字节还是字 或者是双字等。,)变量的定义变量一般都是在数据段或附加段中使用伪指令(即伪操作命令)、和 来进行定义的,这些伪指令称为数据区定义伪指令,其格式为:
19、变量名 数据区定义伪指令 表达式例:DATA SEGMENTSUM DB 12H,23H,34H,45HCOUNT DW 22H,33H,44AEH,55HDATA1 DD 9876H,ABCDHDATA ENDS在内存的位置:,DATA段:,34,45,22,00,33,00,AE,44,55,00,76,98,00,00,CD,AB,00,00,23,12,SUM,COUNT,DATA1,MOV AX,COUNTAX=0022MOV BX,SUM错数据区大小及初值确定:A. 数字表达式:DATA1 DB 3*5+2B. ASCII字符串(DB)STRING DB HELLOW48H,45H
20、,4CH,4CH,4FH,57H,C.地址表达式:(DW,DD)ADDR DW 1234H,3456H,4567HDISP DW ADDR ;取ADDR在数据段的偏移量DISP1 DD ADDR ;取偏移量和段地址D. ? 无确定初值 ADDR DW ?E. DUP 重复因子 DATA2 DB 20 DUP(?)DATA3 DW 2 DUP(11),3 DUP(22)注意:地址位置及属性MOV AX,DATA3+2MOV AL,DATA3+2 错MOV AL,BYTE PTRDATA3+2,)变量的使用变量是存储器数据区的符号表示,因此指令中的存储器操作数可以用变量形式给出。 程序中必须明确该
21、指令是字节操作还是字操作:a、指令中至少一个操作数能说明是字节还是字操作。例如:MOV AX,BXMOV AL,BX目的操作数说明了操作类型。b、当使用变量进行存储器寻址时,变量的类型必须与指令的要求相符。,例如:DATA2 DB 20 DUP(2A)DATA3 DW 2 DUP(11),3 DUP(22)MOV AX,DATA3+2MOV AL,DATA3+2 错MOV BX,DATA2 错c、若要在该存储器数据段进行操作,可用类型运算符PTR明确指出变量的类型。MOV AL,BYTE PTRDATA3+2,d、变量仅对应数据区的第一个数据,当对其他数据项进行操作时,必须使用地址表达式指出该
22、数据项。例如:DATA DB 12,23,45COUNT DW 1234H,0AB55H,45FEHMOV AL,DATA ;AL=12MOV BL,DATA+1 ;错MOV BL,DATA+1MOV CX,COUNT ;CX=1234HMOV SI,COUNT+2 ;SI=0AB55H,e、可以用PRT属性运算符改变存储器数据区的类型:例如:DATA-W DW 10DUP(0EEH)说明DATA-W段的数据属性为字;用PTR及EQU伪指令建立一个与DATA-W同一数 据段而类型不同的变量方法如下:DATA-B1 EQU BYTE PTR DATA-WDATA-D EQU DWORD PTR
23、DATA-WDATA-B2 EQU BYTE PTR DATA-W+1DATA-B1为20个字节的数据组DATA-D为5个双字的数据组DATA-B2为19个字节的数据组,NOTE,使用变量作为存储器操作数时要注意几个问题。必须在程序中明确一条指令是完成位数据操作还是 1位数据操作。变量作为指令中的存储器操作数使用时,其段属性(段基址)与该指令使用的缺省段寄存器内容必须相符,若不相符则必须使用“跨段前缀”(或称段超越),否则指令无法从存储器中取得正确的操作数进行操作。,)地址表达式汇编语言中表达式有两类数值表达式:在汇编时产生一数值,仅具有大小而无其他属性,可作为执行性指令中的立即操作数和数据区
24、中的初值使用。地址表达式:它表示存储器地址,其值一般都是段内的偏移地址,因此它具有段属性、偏移值属性、类型属性。地址表达式主要用来表示执行性指令中的多种形式的操作数。地址表达式由变量、标号、常量、寄存器,的内容(用寄存器名以及方括号表示)以及一些运算符组成。,地址表达式中可以使用的运算符及使用规则:、数字表达式的三种运算符:变量或标号可以加上或减去某个结果为整数的数值表达式,其结果仍为变量或标号,类型及段地址属性不变,仅修改偏移值属性。由于数值表达式可以出现在地址表达式中,因此,一切数值表达式的运算符都可在地址表达式中出现。同一段内的两个变量或标号可以相减,但结果不是地址,而是一个数值,表示两
25、者间相距的字节数。MOV AX,1000+50*4,、方括号及寄存器BX,BP,SI,DI如这几个寄存器不用方括号括起来,表示寄存器本身或操作数。例: , 表示将中的内容送中如这几个寄存器用方括号括起来,则表示地址表达式。 例: , 表示将所指的存储单元中的字数据送中,c 、运算符是类型运算符,它用来说明某个变量、标号或地址表达式的类型属性,或者使它们临时兼有与原定义所不同的类型属性,但保持它们原来的段属性和偏移地址属性不变。格式为:数据类型 PTR 地址表达式根据地址表达式的不同值,数据类型可以是BYTE、WORD、DWORD、NEAR、FAR等。例:ADD BYTE PTRDI,23H P
26、RT指定地址表达式DI的类型为字节,此句表示将23H与内存字节单元DI中的字节数据相加,结果送回内存字节单元DI。,d、段超越运算符段超越运算符用来临时给变量、标号或地址表达式指定一个段属性。段超越运算符格式:段名:地址表达式或段寄存器名:地址表达式,例:INC BYTE PTR ES:BP+3ES:为跨段前缀,冒号“:”前的ES段寄存器指明了操作数当前所在的段为附加数据段。这时,操作数的物理地址将由ES中的内容左移4位与偏移地址BP+3相加而求得。此句表示将附加数据段中偏移地址为BP+3的内存单元中的数据加1后仍保留在该单元中。跨段时, 物理地址的计算是由系统自动完成的。如果没有跨段前缀“E
27、S:”,那么,由BP+3地址表达式所表示的偏移地址将被系统默认为是在堆栈段中。,(3)运算符综述IBM宏汇编中有5种运算符,即: 算术运算符(Arithmetic operators) 逻辑运算符(Logical operators) 关系运算符(Relational operators) 分析运算符(Analytic operators) 合成运算符(Synthetic operators)前面3种运算符已经介绍了,下面对后2种运算符作一简单介绍。,1)分析运算符分析运算符用来把存储器操作数(变量或标号)分解为它的组成部分(段地址、偏移值、类型 、数据字节总数、数据项总数等),并以数值形式回
28、送给存储器操作数(变量或标号)。A. SEG 取段地址MOV BX,SEG DATA1B. OFFSET 取偏移值MOV AX,OFFSET DATA1C. TYPE 取类型值DB:1,DW:2,DD:4,DQ:8,DT:10,NEAR:-1,FAR:-2MOV AX,TYPE DATA1,D. SIZE 取数据区字节总数MOV AX,SIZE DATA1E. LENGTH 取数据区数据项数(DUP),如未用DUP,结果是1。MOV AX,LENGTH DATA1SIZE=LENGTHTYPEF. HIGH 取高8位G. LOW 取低8位例 COUNT EQU 0ABCDHMOV AH,HIG
29、H COUNT;AH=ABMOV AL,LOW COUNT;AL=CD,例如: DATA1 DW ?DATA2 DB 45,29HARRAY DW 100DUP(22)则: MOV BX,SEG DATA1;取L2的段基址MOV BX,OFFSET DATA2;取L2的偏移量MOV AX,TYPE DATA1;AX=2MOV AX,TYPE DATA2;AX=1MOV CX,LENGTH DATA1;CX=1MOV CX,LENGTH DATA2;CX=1MOV CX,LENGTH ARRAY;CX=100MOV CX,SIZE DATA1; CX=2MOV CX,SIZE ARRAY;CX=
30、200,2)合成运算符合成运算符用来把存储器操作数的属性部分建立一个新的存储器地址操作数A.PTR:例: DATA2 DW 12,34DATA1 EQU BYTE PTR DATA2B.THIS: 格式:THIS 例: DATA1 EQU THIS BYTEDATA2 DW 1234C.SHORT:例如: 指定某个标号为短标号。,3) 运算符的优先级,(三)伪指令语句伪指令语句又称为说明性指令或指示语句。高级语言程序中的可执行语句被翻译成机器语言时,必须有非执行语句用于实现赋值、保留存储器,给常数分配符号名字、形成数据结构和终止编译等。当汇编语言被翻译成机器语言时,也必须包括有执行类似任务的伪
31、指令。同时,由于还依靠段寄存器工作,所以,还必须包括有一些在汇编过程中能告诉汇编程序把某个段分配给哪一个段寄存器的伪指令。,伪指令语句的格式为:名字 伪指令助记符 参数表 ;注释名字是一标识符,一般不能有“:”结尾,名字可以是符号常量名、段名、变量名等,由不同的伪指令决定。参数表是用“,”分隔开的一系列参数(包括操作数)。,、5种数据定义伪命令)(定义字节)用于申请一个数据项为字节的数据区,需要时可以用数值表达式赋予初值。如果该数据区定义作为一个变量,则变量类型是。 )(定义字)数据项为字,允许用地址表达式为数据项赋初值(即偏移量属性),变量类型是。,)(定义双字)数据项为双字,允许用地址表达
32、式为数据项赋初值(即段属性及偏移量属性),变量类型为。 )(定义4字)数据项为4字,变量类型为BYTE。 )(定义10字节)数据项为10个字节,变量类型为。*:在存储器中的排列顺序:低字节在前,高字节在后。, ,这段程序用DB、DW和DD定义了若干变量,根据上述对数据定义命令的约定,则各变量及其属性可列于表4.5中:所有变量的段属性(分量)均为。、右边的表达式或数值即相应存储单元中的内容,汇编后的存储器分配情况如图4.3所示。,数据定义的作用存储器初始化、可用于初始化存储器。这些伪指令的右边有一表达式,表达式之值即该存储“单位”的初值。一个存储单位可以是字节、字、双字。表达式有数值表达式与地址
33、表达式之分,在使用地址表达式来初始化存储器时,这样的表达式只可在或伪操作命令中出现,绝不允许出现在中。“变量” 语句表示利用该变量的偏移量来初始化相应的存储字;“变量”语句表示利用该变量的段分量和偏移量来初始化相应的两个连续的存储字,低位字中是偏移量,高位字中是段分量。, ;内容为 ;内容为;即高位字为,低位字为 ;内容为 ;内容为 * ;内容为 ,)从单元开始分配个存储单元。 )为 个字节存储单元设置初值。 汇编后将变量的偏移量存入其前2个字节内存单元; 而将段的段地址存入其后2个字节内存单元中。 伪指令中的2个字节即表示变量的偏移地址及段地址。 一个字节的操作数也可以是某个字符的代码,注意
34、只允许在伪操作命令中用字符串来初始化存储器。,例4.26 HELLO AB W AB ,、符号定义伪指令汇编语言中所有的变量名、标号名、过程名、指令助记符、寄存器名等统称“符号”,这些符号可以通过伪指令重新命名,也可以通过伪指令为其定义其他名字及新的类型属性。 (1)EQU:,)为常量定义一个符号,以便在程序中使用符号来表示常量。格式:符号常量名 数值表达式 例如:SUM EQU 20HMOV AL,SUM ;(AL)=20H)给变量或标号定义新的类型属性并起一个新的名字。格式:变量名或标号名 类型 变量或标号 例如:DATA EQU THIS WORDDATA1 DB ABCDEFG,)可以
35、给由地址表达式指出的任意存储单元定义一个名字。格式:符号名 地址表达式符号名可以是“变量”或“标号”,取决于地址表达式的类型。 例如:ADR EQU ES:BX+SI+5MOV AL,ADR ;将BX+SI+5单元内容送到AL)用来为汇编语言中的任何符号定义一个新的名字。格式:新的名字 原符号名 例如:CBCD EQU AAM)使用伪操作命令时,左端的符号名不能是程序已定义过的符号名。,()(等号伪指令)它与基本类似,起赋值作用 )使用“”定义的符号名可以被重新定义,使符号名具有新值。 例: ;先将12赋于符号名X ;将符号名X重新定义使其具有新值则在第2个语句经过汇编后,最终。 )习惯上“”
36、主要用来定义符号常量。,()(类型定义伪指令)伪指令为当前存储单元定义一个指定类型的变量或标号。其格式为:变量名或标号名 类型对于数据项,类型可以是、;对于可执行的指令代码,类型 为和。伪指令不仅给名字(标号或变量)定义一个类型属性,而且隐含有给名字定义段属性和段内偏移量属性。 例如:AREAW LABEL WORDAREAB DB 100 DUP(23)MOV AREAW,AXMOV AREAB49,AL,、段定义伪指令段定义伪指令指示汇编程序应如何按段来组织程序和使用存储器。所用命令主要有,等。()和伪指令和伪指令用来把程序模块中的指令或语句分成若干逻辑段,其格式如下:,段名 定位类型组合
37、类型 类别 ;一系列汇编指令段名 格式中与必须成对出现,与之间为段体,给其赋于一个名字,名字由用户指定,是不可省略的,而定位类型、组合类型和类别是可选的。例如:DATA SEGMENTAAA DB 20 DUP(?)BBB DW 10 DUP(?)DATA ENDS,)定位类型又称“定位方式”,表示该段对起始边界地址的要求,有4种定位类型: 起始地址即字节型; 起始地址即字型; 起始地址即节型; 起始地址即页型。其中为隐含值,即如果省略“定位类型”,则汇编程序按处理。,)组合类型组合类型又称“联合方式”或“连接类型”。它指示连接程序,如何将某段与其他段组合起来的关系。连接程序不但可以将不同模块
38、的同名段进行组合,并根据组合类型,可将各段顺序地连接在一起或重叠在一起。共有6种组合类型:A.不组合:缺省,汇编将不同的逻辑段分别在装入。B.PUBLIC:将相同名字的逻辑段集中成一个段装入。C.STACK:同PUBLIC,仅限堆栈段用。D.COMMON:对于相同名字的逻辑段,从同一个地址开始装入,导致逻辑段重叠,连接后的段长为原最长逻辑段,内容是最后逻辑段内容。,E.MEMORY:本逻辑段放在所有段的最后,若出现多个MEMORY段,其余作COMMON段处理。F.AT:表示该段定位段地址。)类别类别是用单引号括起来的字符串,以表示该段的类别,连接程序只使同类别的段发生关联,连接时用于组成段组的
39、名字。典型的类别如、 、等,也允许用户在类别中用其他的表示。例如:,(2) ASSUME 伪指令ASSUME是段定义伪指令,它一般出现在代码段中,用来告诉汇编程序哪一个段寄存器是其对应段的段地址寄存器。当在程序中使用这条语句后,汇编程序就能将被设定的段作为当前可访问的段来处理。它也可以用来取消某段寄存器与其原来设定段之间的对应关系(使用NOTHING即可)。引用该伪指令后,汇编程序才能对使用变量或标号的指令汇编出正确的目标代码。其格式为:ASSUME 段寄存器:段名,段寄存器名:段名其中“段名”可以是程序中已定义过的任何段名或组名,也可以是表达式“SEG变量”或“SEG标号”,或者是关键字NO
40、THING。,例4.34:ASSUME CS:SEGA,DS:SEGB,SS:NOTHING其中:SEGA是代码段SEGB是数据段NOTHING表示SS所作的设定已取消。CS的段地址由系统决定;DS的段地址由编程直接装入。,()伪指令伪指令用来指出其后的程序段或数据块存放的起始地址的偏移量。其格式为: 表达式汇编程序把语句中表达式之值作为起始地址,连续存放程序和数据,直到出现一个新的指令。若省略,则从本段起始地址开始连续存放。,例如: DATA SEGMENTORG 6A DW 1234HORG $+4B DW 5678HDATA ENDS,34,12,78,56,DATA,1000H,000
41、6H+1000H,000CH+1000H,、过程定义伪指令 过程分为两类:外部过程:当调用该过程的主程序与该过程不在一个源程序文件中时,该过程应定义成外部过程。这时在主程序文件中应说明该过程(设过程名为)为外部过程: :在定义该过程的程序文件中应说明该过程可被其他程序文件调用: 内部过程:当调用该过程的主程序与该过程在同一个源程序文件中时,该过程叫做内部过程。,(2)过程定义伪指令格式:过程名 类型 ;指令序列过程名 类型可选作或。选时,该过程一定要与主程序在一个段;选时,该子程序可以与主程序在同一个段,也可与主程序不在同一个段。如果类型省略,则系统取类型。例如: NAME1 PROC FAR
42、CALL NAME2RETNAME2 PROCNAME2 ENDPNAME1 ENDP,(3)调用过程调用过程用“过程名”来实现。其中过程名是个标识符,可作为调用此过程的指令中的操作数。过程可以“嵌套”使用,即过程中又可以调用别的过程;过程还可以“递归”使用,即过程中又可以调用过程本身。调用指令的使用要和过程的属性一致,尤其是一个过程已定义为的话,那末即使当前调用指令和此过程有同一代码段,也必须使用段间调用指令,否则将会出错。IP及CS的入栈(4)过程返回RET nIP及CS的出栈,例4.36:SEGX SEGMENTCALL FAR PTR SUBTSUBT PROC FARRETSUBT
43、ENDPSEGX ENDSSEGY SEGMENTCALL FAR PTR SUBTSEGY ENDS,4.3 汇编语言程序设计基本方法,与高级语言编程相似,编写汇编语言源程序也应当首先理解和分析题意与要求,选择适当的数据结构和算法,然后,再着手用汇编语言来实现。有关8086/8088汇编源程序的结构及语法规则,我们在前面已有详述。从中可以看到,在环境下的汇编语言程序结束时,通常用的号中断调用,以便使程序控制返回。MOV AH,4CHINT 21H,目录,一、顺序结构程序,例:对两个字节无符号数求和,这两个数分别用变量及表示。将两数之和的最高位进位放在中,两数之和的其他位按从高到低顺序依次放在
44、,中。,程序如下:D SEGMENT D1 DB 12H,34H,56H,78H,9AH,0ABH,0BCH,0CDHD2 DB 0CDH,0BCH,0ABH,9AH,78H,56H,34H,12HD ENDSC SEGMENTASSUME CS:C,DS:D ;说明代码段、数据段BG: MOV AX,DMOV DS,AX ;给DS赋段值LEA DI,D1 ;将D1表示的偏移地址送DIMOV DX,DI ;取第1操作数到寄存器中MOV CX,DI+2MOV BX,DI+4,MOV SI,DI+6LEA DI,D2 ;将D2表示的偏移地址送DIADD DX,DI ADC CX,DI+2ADC BX,DI+4ADC SI, DI+6MOV AL,0ADC AL,0MOV AH,4CHINT 21HC ENDSEND BG,