1、教学重点本章重点掌握:程序的格式、开发方法参数的表达、变量的定义变量和标号的属性第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构第一章第一章 基础知识基础知识机器语言计算机能够直接识别并执行的二进制机器指令序列优点:开销小、运行速度快;缺点:难以编写和理解,编程效率很低。汇编语言(Assembly Language)用助记符号表示机器指令代码、变量地址,标号等的符号指令序列。优点:易记、易理解,易编写程序,大大提高了编程效率;问题:需要将助记符号翻译为机器语言。汇编语言源程序:用汇编语言编写的程序。汇编程序:将助记符号翻译为机器语言的语言处理程序,以便 计算机能够识
2、别。汇编:将助记符号翻译为机器语言的过程。理解以上几个名词概念:汇编语言、汇编语言源程序、汇编程序、汇编概概 念念第一节:汇编程序功能及上机过程 汇编程序功能 汇编程序的主要功能如下:(1)检测语法错 显示错误信息(2)源程序文件 二进制目标文件(并输出*.LST文件)(3)展开宏指令一般汇编程序都应具有如下功能:宏汇编功能 支持地址和数据的符号表示 支持内存管理 支持程序的模块化组织 支持多种类型的数据表示等 汇编程序依赖于硬件,不同机型的系统有自己的汇编程序。上机过程 上机过程如图所示第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构汇编语言源程序的结构与书写格式
3、汇编语言源程序是段结构的:代码段、数据段、堆栈段、附加段 源程序由段组成,每段有一个段名,segment定义段起点,ends定义段结束点。每段由若干语句行组成,源程序以end结束。例字符串传送指令和伪指令使CPU产生动作、并在程序执行时才处理的语句,就是前一章学习的处理器指令(Directive)不产生CPU动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等 伪指令与具体的处理器类型无关,但与汇编程序的版本有关 本课程采用微软宏汇编程序本课程采用微软宏汇编程序 MASM 5.0MASM 5.0汇编语言语句一般格式为:标识符/语句标号 指令名 操作数序列 ;注释 标识符用
4、来为变量、段及过程等命名 语句标号标识符后加:,提供转移地址指令名指令可分为三类:机器指令、伪指令和宏指令。机器指令:指令系统中的指令,程序运行时由CPU执行;伪指令:汇编程序执行的操作,规定汇编程序如何按要求进行汇编及分配内存。宏指令:由一系列指令或伪指令构成,汇编时展开成若干条机器指令,用于提高编程效率。操作数序列可以是常量、变量、表达式、寄存器名或标号等,用逗号隔开。(伪指令和宏指令由汇编程序在汇编期间处理伪指令和宏指令由汇编程序在汇编期间处理)注释符“;”后可给出语句注释,提高可读性和可理解性。第二节:汇编语言语句格式与分类第二节:汇编语言语句格式与分类(1)常量 00110110B
5、389D 467O B407H 3.475E+5 Input a number(2)变量 变量名:存储单元的符号地址 变量值:存储单元中的数据MOV AL,Amov al,a变量的三种属性:段值(SEG):变量所在段的起始地址 偏移量(OFFSET):段起点距离变量所在存储单 元位置的字节数50偏移量段起点类型(TYPE):变量占用的字节数常量、变量、标号常量、变量、标号(3)标号 标号:存放指令的存储单元的符号地址,常用作转移地址。NEAR :2字节转移地址 CMP AX,BX JNE NEXT NEXT:MOV AX,0 标号的三种属性:段值(SEG):标号所在段的起始地址 偏移量(OFF
6、SET):段起点距离标号所指存储单 元位置的字节数 类型(TYPE):NEAR,FAR(偏移地址)短指针(近指针)段内转移FAR:4字节转移地址(段、偏移地址)长指针(远指针)段间转移第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构汇编语言程序的语句类型:汇编语言程序的语句类型:1、程序执行指令语句。、程序执行指令语句。2、伪操作语句。、伪操作语句。3、宏指令语句。、宏指令语句。伪操作的功能:伪操作的功能:伪操作又称为伪指令,它不象机器指令那样是在程序运行期间由伪操作又称为伪指令,它不象机器指令那样是在程序运行期间由计算机来执行的,它是在汇编程序对源程序汇编期间由汇
7、编程序处理的操作,它计算机来执行的,它是在汇编程序对源程序汇编期间由汇编程序处理的操作,它们可以完成如下功能:们可以完成如下功能:(1 1)符号定义伪指令)符号定义伪指令 (2 2)数据定义伪指令)数据定义伪指令 (3 3)段定义伪指令)段定义伪指令 (4 4)过程定义伪指令过程定义伪指令 (5 5)条件汇编伪指令)条件汇编伪指令 (6 6)宏指令)宏指令 (7 7)结构与记录)结构与记录 一、一、数据定义及存储器分配伪操作数据定义及存储器分配伪操作 格式:Variable Mnemonic Operand,Operand ;Comments 变量(变量(Variable)字段:)字段:是可有
8、可无的,它用符号地址表示,其作用与指令语句是可有可无的,它用符号地址表示,其作用与指令语句前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序使其记以第前的标号相同,但它的后面不跟冒号。如果语句中有变量则汇编程序使其记以第一个字节的偏移地址。一个字节的偏移地址。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构注释(Comments)字段:用来说明该伪操作的功能,它也是可有可无的。助记符(Mnemonic)字段:说明所用伪操作的助记符,常用的有以下几种:DB伪操作:伪操作:用来定义字节,其后的每个操作数都占有一个字节。用来定义字节,其后的每个操作数都占有一个字
9、节。DW的操作:的操作:用来定义字,其后的每个操作数占有一个用来定义字,其后的每个操作数占有一个字字(低位字节低位字节在第一个字节地址中,在第一个字节地址中,高位字节在第二个字节地址中高位字节在第二个字节地址中)。DD伪操作:伪操作:用来定义双字,其后的每个操作数占有二个字。用来定义双字,其后的每个操作数占有二个字。DQ伪操作:伪操作:用来定义四个字,其后的每个操作数占有四个字。用来定义四个字,其后的每个操作数占有四个字。DT伪操作:伪操作:用来定义十个字节,其后的每个操作数占有十个字节用来定义十个字节,其后的每个操作数占有十个字节,形成压缩的,形成压缩的BCD码。码。这些伪操作可以把其后面跟
10、着的数据存入指定的存储单元,或者只分配存储器空这些伪操作可以把其后面跟着的数据存入指定的存储单元,或者只分配存储器空间而并不存入确定的数值。间而并不存入确定的数值。DW和和DD伪操作可以存储偏移地址或完整的地址伪操作可以存储偏移地址或完整的地址。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构例例 操作数可以是常数,或者是表达式操作数可以是常数,或者是表达式(根根据该表达式可以求得一个常数据该表达式可以求得一个常数),如,如 DATA_BYTE DB 10,4,l0H DATA_WORD DW 100,100H,-5 DATADW DD 3*20,0FFFDH汇编程
11、序可以在汇编期间在存储器中存入汇编程序可以在汇编期间在存储器中存入数据,如右图所示。数据,如右图所示。例例 操作数也可以是字符串,如:操作数也可以是字符串,如:MESSAGE DB H2LLOMESSAGE DB H2LLO则存储器存储情况如下图所示:则存储器存储情况如下图所示:第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构注意:注意:DB AB和和DW AB的存储的存储 分配空间的不同。如下图:分配空间的不同。如下图:例例 操作数?可以保留存储空间,但不存操作数?可以保留存储空间,但不存入数据。入数据。如:如:ABC DB 0,?,?,?,0 DFF DW?,5
12、2,?经汇编后的存储情况如右图所示。经汇编后的存储情况如右图所示。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构 操作数字段还可以使用复制操作符来复制某个(或某些)操作数。其格式为操作数字段还可以使用复制操作符来复制某个(或某些)操作数。其格式为:repeat_count DUP(operate,operate,)其中其中repeat_count可以是一个表达式,可以是一个表达式,它的值应该是一个正整数,用来指定括号它的值应该是一个正整数,用来指定括号中的操作数的重复次数。中的操作数的重复次数。例例 ARRAYl DB 2 DUP(0,1,2,?,?)ARRAY2
13、 DB 100 DUP(?)汇编后的存储情况如下图所示。汇编后的存储情况如下图所示。ARRAYl DB 2 DUP(0,1,2,?,?)和以下语句是等价的:和以下语句是等价的:ARRAYl DB 0,I,2,?,0,1,2,?第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构例例 DUP操作可以嵌套,例如操作可以嵌套,例如ARRAY3 DB 100DUP(0,2 DUP(1,2),0,3)则汇编结果如右图所示:则汇编结果如右图所示:可以用可以用DW或或DD伪操作把变量或标号的偏移地址伪操作把变量或标号的偏移地址(DW)或整个地址或整个地址(DD)存入存储器。用存入存储
14、器。用DD伪操作存入伪操作存入地址时,第一个字为偏移地址,第二个字为段地址。地址时,第一个字为偏移地址,第二个字为段地址。例如例如 PARAMETER_TABLE DW PAR1 DW PAR2 DW PAR3 INTERSEG_DATA DD DATA1 DD DATA2则汇编后的存储情况如下图所示。其中偏移地址或段地址则汇编后的存储情况如下图所示。其中偏移地址或段地址均占有一个宇,其低位字节占有第一个字节,高位字节占均占有一个宇,其低位字节占有第一个字节,高位字节占有第二个字节。有第二个字节。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构第一章第一章 基础知识
15、基础知识第五章第五章 汇编语言程序结构汇编语言程序结构顺便说明一下,这里操作数字段中的变量或标号可以使用表达式如顺便说明一下,这里操作数字段中的变量或标号可以使用表达式如:在这种情况下,汇编后,存储器中应该存入表达式的值。在这种情况下,汇编后,存储器中应该存入表达式的值。例如例如 PARAMETER_TABLE DW PAR1+1 DW PAR2+1 说明变量的类型属性问题说明变量的类型属性问题:在数据定义伪操作前面的变量的值是该伪操作中的第一个数据项在当前在数据定义伪操作前面的变量的值是该伪操作中的第一个数据项在当前段内的第一个字节的偏移地址。此外,它还有一个类型属性用来表示该语句段内的第一
16、个字节的偏移地址。此外,它还有一个类型属性用来表示该语句中的每一个数据项的长度中的每一个数据项的长度(以字节为单位表示以字节为单位表示),因此,因此DB伪操作的类型属性为伪操作的类型属性为1,DW为为2,DD为为4,DQ为为8,DT则为则为10,变量表达式的属性和变量是相同的。,变量表达式的属性和变量是相同的。汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节汇编程序可以用这种隐含的类型属性来确定某些指令是字指令还是字节指令。指令。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构例如例如 OPER1 DB?,?,?OPER2 DW?,?,?MOV OPE
17、R1,0 MOV OPER1,0 MOV OPER2,0 MOV OPER2,0 则第一条指令应为字节指令,第则第一条指令应为字节指令,第二条指令则应为字指令。二条指令则应为字指令。如果有下列指令序列如果有下列指令序列:OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX,OPER1+1 MOV AL,OPER2 汇编程序在汇编这一段程序时,能发汇编程序在汇编这一段程序时,能发现两条现两条MOV指令的两个操作数的类型属指令的两个操作数的类型属性是不相同的:性是不相同的:OPERl十十1为字节类型属性而为字节类型属性而AX为字为字类型属性;类型属性;OPER2为字类型
18、属性而为字类型属性而AL为字节类为字节类型属性。型属性。汇编语言将指示由于属性类型不匹配出错。汇编语言将指示由于属性类型不匹配出错。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构有一个办法可以指定操作数的类型属性,有一个办法可以指定操作数的类型属性,它优先于隐含的类型属性,即可以使用它优先于隐含的类型属性,即可以使用PTR属性操作符属性操作符。其格式为:。其格式为:type PTR Varible士士 constant expression其中类型可以 是其中类型可以 是 BYTE,WORD或或DWORD(双字双字),这样变量的类型就可以,这样变量的类型就可以指定
19、了。上面例子可以写为:指定了。上面例子可以写为:OPER1 DB 1,2 OPER2 DW 1234H,2345H MOV AX,WORD PTR OPER1+1 MOV AL,BYTE PTR OPER2 通过通过PTR属性操作符就把属性操作符就把OPER1十十1的类型属性指定为字,两个操作数的的类型属性指定为字,两个操作数的属性就一致了,汇编时不会出错,而属性就一致了,汇编时不会出错,而运行时应把运行时应把OPER1十十1的字内容送到的字内容送到AX,即把,即把OPER1十十1的内容送的内容送AL,把把OPER2的第一个字节的内容运的第一个字节的内容运AH,所以指令执行完后,所以指令执行完
20、后,(AX)3402H。同样,对于第二条语句(同样,对于第二条语句(AL)=34H 第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构LABEL伪操作伪操作:除了用属性操作符给以定义外,还可以用除了用属性操作符给以定义外,还可以用LABEL伪操作来定义,其格式为:伪操作来定义,其格式为:name LABEL type (1)对于数据项可以表示为:对于数据项可以表示为:variable_name LABEL type其中,其中,type可以是可以是BYTE,WORD或或DWORD(双字双字)。(2)对于可执行的代码,则可表示为)对于可执行的代码,则可表示为 label_
21、name LABEL type其中,其中,type可以是可以是NEAR或或FAR。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构例如例如4.9 BYTE_ARRAY LABEL BYTE WORD_ARRAY DW 50 DUP(?)这样在这样在100个字节数组中的第一个字节的地址赋于二个不同类型的变量名:个字节数组中的第一个字节的地址赋于二个不同类型的变量名:字节类型的变量字节类型的变量BYTE_ARRAY和字类型变量和字类型变量WORD_ARRAY。指令指令 MOV WORD_ARRAY十十2.,0把该数组的第把该数组的第3个和第个和第4个字节置个字节置0,而
22、,而 MOV BYTE_ARRAY十十2.,0则把该数组的第则把该数组的第3个字节置个字节置0。例:例:LABF LABEL FARLABF LABEL FAR LAB LAB:MOV AXMOV AX,100 100 第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构二、表达式赋值伪操作二、表达式赋值伪操作EQU 有时程序中多次出现同一个表达式为方便起见可以用赋值伪操作给表达式有时程序中多次出现同一个表达式为方便起见可以用赋值伪操作给表达式赋予一个名字,其格式如下:赋予一个名字,其格式如下:此后,程序中凡需要用到该表达式之处就可以用表达式名来代替了。此后,程序中凡需
23、要用到该表达式之处就可以用表达式名来代替了。上式中的表达式上式中的表达式可以是任何有效的操作数格式可以是任何有效的操作数格式,可以是任何可以求出常数值的表可以是任何可以求出常数值的表达式,也可以是任何有效的助记符。达式,也可以是任何有效的助记符。举例如下:举例如下:第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构必须注意必须注意EQU语句的表达式中如果有变量或标号的表达式,则在该语句前应该语句的表达式中如果有变量或标号的表达式,则在该语句前应该先给出它们的定义。先给出它们的定义。例如,语句例如,语句:则必须放在则必须放在DATA_ONE的定义之后才行,否则汇编程序将
24、指示出错。的定义之后才行,否则汇编程序将指示出错。另外还有一个与另外还有一个与EQU相类似的相类似的=伪操作也可以作为赋值伪操作使用。伪操作也可以作为赋值伪操作使用。它们它们之间的区别是之间的区别是:EQU伪操作中的表达式名是不允许重复定义的,而伪操作中的表达式名是不允许重复定义的,而=伪操作则伪操作则允许重复定义。允许重复定义。例如:例如:EMP=6 或或 EMP EQU 6都可以使数都可以使数6赋以符号名赋以符号名EMP,但是不允许两,但是不允许两者同时使用。者同时使用。第一个语句后的指令中第一个语句后的指令中EMP值为值为7;而第二个语句后的指令中;而第二个语句后的指令中EMP值为值为8
25、。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构三、段定义伪操作三、段定义伪操作 存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程存储器的物理地址是由段地址和偏移地址组合而成的,汇编程序在把源程序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息序转换为目标程序时,必须确定标号和变量的偏移地址,并且需要把有关信息通过目标模块传送给连接程通过目标模块传送给连接程序,以便连接程序把不同的段和模块连接在一起形序,以便连接程序把不同的段和模块连接在一起形成一个可执行程序。为此,需要用段定义伪操作,成一个可执行程序。为此,需要用段定义伪操作,
26、段定义伪操作的格式如下段定义伪操作的格式如下:此外,还要明确段和段寄存器的关系,这可用此外,还要明确段和段寄存器的关系,这可用ASSUME伪操作来实现,其格式为:伪操作来实现,其格式为:其中其中assignment说明分配情况,其格式为:说明分配情况,其格式为:其中段寄存器名必须是其中段寄存器名必须是CS、DS、ES和和SS中的一个,而段名则必须是由中的一个,而段名则必须是由segment定义的段中的段名。定义的段中的段名。而而ASSUME NOTHING则可取消前面由则可取消前面由ASSUME所指定的段寄存器。所指定的段寄存器。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编
27、语言程序结构例如:例如:由于由于assume伪操作只是指定某个段分配给那一个段寄存器,它并不能把段地伪操作只是指定某个段分配给那一个段寄存器,它并不能把段地址装入段寄存器中,所以在代码段中。还必须把段地址装入相应的段寄存器中。址装入段寄存器中,所以在代码段中。还必须把段地址装入相应的段寄存器中。为此,在上例的程序中,分别用两条为此,在上例的程序中,分别用两条MOV指令完成这一操作。如果程序中有堆指令完成这一操作。如果程序中有堆栈段,也需要把段地址装入栈段,也需要把段地址装入SS中。中。但是,代码段不需要这样做,代码段的这一操但是,代码段不需要这样做,代码段的这一操作在程序初始化时完成。作在程序
28、初始化时完成。功能:功能:通知MASM用指定的段寄存器来寻址对应的逻辑段,即建立段寄存器与段的缺省关系在明确了程序中各段与段寄存器之间的关系后,汇编程序会根据数据所在的逻辑段,在需要时自动插入段超越前缀。这是ASSUME伪指令的主要功能ASSUME伪指令并不为段寄存器设定初值,连接程序LINK将正确设置CS:IP和SS:SP由于数据段通常都需要,所以在样板源程序中,首先为DS赋值;如果使用附加段,还要赋值ES段寄存器的装入DS和ES的装入通过寄存器传送如:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AXSS的装入(1)自动装入采用定义段时指定组合类型S
29、TACK参数,在ASSUME语句中建立SS的关系,这样就可以自动装入SS。SS段寄存器的装入stack1segment para stackdw 40h dup(?)stack1ends code1segmentassume cs:code1,ss:stack1,SS段寄存器的装入(2)程序设置stack1segment para stackdw 40h dup(?)toplabelwordstack1ends code1segmentassume cs:code1,ss:stack1,mov ax,stack1mov ss,axmov sp,offset top CS和IP的装入(1)初始化
30、时装入,根据END伪指令指示的地址 END 标号END语句的作用:告诉汇编程序,源程序结束指定程序运行时的起始地址,即:seg 标号 csoffset 标号 ip汇编结束伪指令END 标号 指示汇编程序MASM到此结束汇编过程 源程序的最后必须有一条END语句 可选的标号用于指定程序开始执行点,连接程序将据此设置CS:IP值 不要糊涂程序终止和汇编结束是两码事CS和IP的装入(2)自动修改CS和IP执行CALL FAR和RET指令执行JMP FAR指令响应中断及中断返回(IRET)RESET 第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构SEGMENT伪操作还可以
31、增加类型及属性的说明,格式如下伪操作还可以增加类型及属性的说明,格式如下:一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程一般情况下,这些说明可以不用。但是,如果需要用连接程序把本程序与其他程序模块相连接时,就需要使用这些说明。分别叙述如下:序模块相连接时,就需要使用这些说明。分别叙述如下:*定位类型定位类型(align_type)可以是可以是:段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 段字段字类别名类别名 段名段名 ENDS 实际上定位类型可以理解为实际上定位类型可以理解为对两个相临段的段地址给予的一些规定对两个相临段的段地址给予的一些规定。定位类型
32、可以。定位类型可以有以下几种:有以下几种:PARA:指定所定义的段开始于小段边界,实际是规定这个段的起始地址与前面:指定所定义的段开始于小段边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须是一个段的起始地址之差必须是16字节的整数倍。这意味着相临两个段的段地址之差最字节的整数倍。这意味着相临两个段的段地址之差最小也得是小也得是1。PAGE:指定定义的段开始于页边界,实际是规定这个段的起始地址与前面一个:指定定义的段开始于页边界,实际是规定这个段的起始地址与前面一个段的起始地址之差必须是段的起始地址之差必须是256字节的整数倍。字节的整数倍。BYTE:所定义的段开始于字节边界,实际
33、上是指这个段可以从任何地址开始。:所定义的段开始于字节边界,实际上是指这个段可以从任何地址开始。WORD:所定义的段开始于字边界,实际是指这个段只能从偶数地址开始。:所定义的段开始于字边界,实际是指这个段只能从偶数地址开始。如果源程序中指定了段的定位类型为如果源程序中指定了段的定位类型为PARA或或PAGE,那么获得的可执行文件,那么获得的可执行文件中相临段的段地址就有差异。中相临段的段地址就有差异。但是如果源程序中指定了段的定位类型是但是如果源程序中指定了段的定位类型是BYTE或或WORD,那么在可执行文件,那么在可执行文件中相临段的段地址就有可能相同。中相临段的段地址就有可能相同。为了说明
34、这个问题,我们下面给出了一个程序例:为了说明这个问题,我们下面给出了一个程序例:第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构*组合类型组合类型 (combine_type)设置一定的组合类型就可以通知设置一定的组合类型就可以通知LINK程序把一些分散在不程序把一些分散在不同模块内的同类型段组织在一个段内,这样可以使最终形成的可执行文件结构比较清晰。同模块内的同类型段组织在一个段内,这样可以使最终形成的可执行文件结构比较清晰。PUBLIC 该段连接时将与有相同名字的其他分段连接在一起。其连接次序由连该段连接时将与有相同名字的其他分段连接在一起。其连接次序由连接命令
35、指定。接命令指定。COMMON 该段在连接时与其他同名分段有相同的起始地址,所以会产生覆盖。该段在连接时与其他同名分段有相同的起始地址,所以会产生覆盖。COMMON的连接长度是各分段中的最大长度。的连接长度是各分段中的最大长度。AT expression 使段的起始地址是表达式所计算出来的使段的起始地址是表达式所计算出来的16位段地址。但它不能用位段地址。但它不能用来指定代码段。来指定代码段。STOCK 指定该段在运行时为堆栈段的部分。指定该段在运行时为堆栈段的部分。MEMORY 指定该段将分配在所有其他连接在一起的段的前面指定该段将分配在所有其他连接在一起的段的前面(在高地址上在高地址上),
36、如,如果连接时有几个指定果连接时有几个指定MEMORY的段,则遇到的第一段作为的段,则遇到的第一段作为MEMORY段,其他段,其他则作为则作为COMMON段段*类别类别(CLASS)连接时用于组成段组的名字:连接时用于组成段组的名字:可以是:可以是:第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构四、程序开始和结束伪操作四、程序开始和结束伪操作 (ASM(ASM操作规则操作规则)在程序的开始可以用在程序的开始可以用NAME或或TITLE为模块取名字,为模块取名字,NAME的格式是:的格式是:NAME module_name汇编程序将以给出的汇编程序将以给出的modu
37、le_name作为模块的名字。如果程序中没有作为模块的名字。如果程序中没有NAME伪操伪操作,则也可使用作,则也可使用TITLE伪操作,其格式为;伪操作,其格式为;TITLE textTITLE 伪操作可指定每一页上打印的标题。同时,如果程序中没有使用伪操作可指定每一页上打印的标题。同时,如果程序中没有使用NAME伪操作则程序将用伪操作则程序将用text中的前六个字符作为模块名。中的前六个字符作为模块名。text最多可有最多可有60个字符。个字符。如果程序中既无如果程序中既无NAME又无又无TITLE伪操作,则将用源文件名作为模块名伪操作,则将用源文件名作为模块名。所以。所以NAME及及TIL
38、LE伪操作并不是必要的,伪操作并不是必要的,表示源程序结束的伪操作的格式为表示源程序结束的伪操作的格式为:其中标号指示程序开始执行的起始地址。其中标号指示程序开始执行的起始地址。如果多个程序模块相连接,则只有主程如果多个程序模块相连接,则只有主程序要使用标号,其它子程序模块则只用序要使用标号,其它子程序模块则只用END而不必指定标号。而不必指定标号。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构五、对准伪操作五、对准伪操作*EVEN的操作的操作:使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,所以对于使下一个字节地址成为偶数。一个字的地址最好从偶地址开始,
39、所以对于字数组为保证其从偶地址开始,可以在它前面用字数组为保证其从偶地址开始,可以在它前面用EVEN伪操作来达到这一目的。伪操作来达到这一目的。例如:例如:*ORG Constant expression ORG Constant expression 如常数表达式的值为如常数表达式的值为n,则,则ORG伪操作可以使下一个字节的地址成为常数表达式伪操作可以使下一个字节的地址成为常数表达式的值的值n。例。例 :第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构则则VECT1的偏移地址值为的偏移地址值为0AH,而,而VECT2的偏移地址值为的偏移地址值为14H。在汇编程序
40、对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的指在汇编程序对源程序汇编的过程中,使用地址计数器来保存当前正在汇编的指令的地址。地址计数器的值可用令的地址。地址计数器的值可用$来表示,汇编语言允许用户直接用来表示,汇编语言允许用户直接用$来引用地址来引用地址计数器的值,因此计数器的值,因此ORG$+8可以表示跳过可以表示跳过8个字节的存储区。个字节的存储区。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构在指令和伪操作中在指令和伪操作中也可以直接用也可以直接用$来表示地址计数器的值,如来表示地址计数器的值,如JNE$+6则转向地址是则转向地址是JNE指令的首
41、地址加上指令的首地址加上6。在这里,。在这里,$十十6必须是另一条指令的首地必须是另一条指令的首地址,否则,汇编程序指示出错信息。址,否则,汇编程序指示出错信息。当当$用在伪操作的参数字段时用在伪操作的参数字段时,则和用在指,则和用在指令中的情况不同,它表示的是令中的情况不同,它表示的是地址计数器的当前值地址计数器的当前值。如汇编时如汇编时ARRAY分配的偏移地址为分配的偏移地址为0074H,则汇,则汇编后的存储 区 将 如 右 图 所 示。应 该 注 意,编后的存储 区 将 如 右 图 所 示。应 该 注 意,ARRAY数组中的两个十数组中的两个十4得到的结果是不同的,得到的结果是不同的,这
42、是由于这是由于$的值是在不断变化的缘故。当在指令的值是在不断变化的缘故。当在指令中用到中用到$时,它只代表该指令的首地址,而与时,它只代表该指令的首地址,而与$本本身所在的字节无关。身所在的字节无关。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构六、基数控制伪操作六、基数控制伪操作 汇编程序默认的是十进制数,为此,当使用其他基数表示的常数时,需要专汇编程序默认的是十进制数,为此,当使用其他基数表示的常数时,需要专门给以标记如下:门给以标记如下:l l 二进制:后面跟字母二进制:后面跟字母Bl l 十进制:默认,后面也可以跟字母十进制:默认,后面也可以跟字母Dl l
43、 十六进制:后面跟字母十六进制:后面跟字母H,如果第一个字母是,如果第一个字母是A-F时,应在其前面加上时,应在其前面加上数字数字0l l 八进制:后面跟八进制:后面跟O或或Q。RADIX伪操作,可以把伪操作,可以把默认的基数默认的基数改变为改变为2 16范围内的任何基数。格式如下:范围内的任何基数。格式如下:RADIX expression 字符串可以看成串常数,可以用单引号或双引号把字符串放在其中,得到的字符串可以看成串常数,可以用单引号或双引号把字符串放在其中,得到的是字符串的是字符串的ASC码值,例如码值,例如ABCD。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语
44、言程序结构第三节:汇编语言程序格式第三节:汇编语言程序格式汇编语言源程序中的每个语句可以由四项组成,格式如下:汇编语言源程序中的每个语句可以由四项组成,格式如下:其中:其中:名字项是名字项是个符号。个符号。操作项是一个操作码的助记符,它可以是指令、伪操作或宏指令名。操作项是一个操作码的助记符,它可以是指令、伪操作或宏指令名。操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的操作数项由一个或多个表达式组成,它提供为执行所要求的操作而需要的信息。信息。注释项用来说明程序或语句的功能。为识别注释项的开始。也可以从一行注释项用来说明程序或语句的功能。为识别注释项的开始。也可以从一行的第一
45、个字节开始,此时整行都是注释,常用来说明下面一段程序的功能。的第一个字节开始,此时整行都是注释,常用来说明下面一段程序的功能。一一 名字项名字项 源程序中用下列字符来表示名字源程序中用下列字符来表示名字 字母字母A Z 数字数字0 9 专用字符专用字符?、一、一、$第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构注意:(注意:(1)除数字外,所有字符都可以放在源语句的第一个位置。)除数字外,所有字符都可以放在源语句的第一个位置。(2)名字中如果用到)名字中如果用到则必须是第一个字符。则必须是第一个字符。(3)可以用很多字符来说明名字,但只有前面的)可以用很多字符来说
46、明名字,但只有前面的31个字符能被汇编程序所识别。个字符能被汇编程序所识别。用途:名字项可以是标号或变量。它们都用来表示本语句的符号地址,它是可有用途:名字项可以是标号或变量。它们都用来表示本语句的符号地址,它是可有可无的,只有当需要用符号地址来访问该语句时它才需要出现。可无的,只有当需要用符号地址来访问该语句时它才需要出现。标号标号:标号在代码段中定义,后面跟冒号:,它也可以用:标号在代码段中定义,后面跟冒号:,它也可以用LABEL或或EQU伪操作伪操作来定义。此外它还可以作为过程名定义。标号经常在转移指令或来定义。此外它还可以作为过程名定义。标号经常在转移指令或CALL指令的操指令的操作数
47、字段出现,用以表示转向地址。作数字段出现,用以表示转向地址。标号有三种属性;段、偏移及类型。标号有三种属性;段、偏移及类型。段属性:段属性:定义标号的段起始地址,此值必须在一个段寄存器中。而标号的段则总定义标号的段起始地址,此值必须在一个段寄存器中。而标号的段则总是在是在CS寄存器中。寄存器中。偏移属性:偏移属性:标号的偏移地址是标号的偏移地址是16位无符号数,它代表从段起始地址到定义标号的位无符号数,它代表从段起始地址到定义标号的位置之间的字节数。位置之间的字节数。类型属性:类型属性:用用来指出该标号是在本段内引用还是在其它段中引用的。如在段内来指出该标号是在本段内引用还是在其它段中引用的。
48、如在段内引用的,则称为引用的,则称为NEAR,指针长度为,指针长度为2字节:如在段外引用,则称为字节:如在段外引用,则称为FAR,指针,指针长度为长度为4字节。字节。第一章第一章 基础知识基础知识第五章第五章 汇编语言程序结构汇编语言程序结构变量:变量:变量在除代码段以外的其他段中定义,后面不跟冒号。它也可以用变量在除代码段以外的其他段中定义,后面不跟冒号。它也可以用LABEL或或EQU伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及伪操作来定义。变量经常在操作数字段出现。它也有段、偏移及类型三种属性。类型三种属性。段属性:段属性:定义变量的段起始地址,此值必须在一个段寄存器中。定义变
49、量的段起始地址,此值必须在一个段寄存器中。偏移属性;偏移属性;变量的偏移地址是变量的偏移地址是16位无符号数,它代表从段的起始地址到定义变位无符号数,它代表从段的起始地址到定义变量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,量的位置之间的字节数。在当前段内给出变量的偏移值等于当前地址计数器的值,当前地址计数器的值可以用当前地址计数器的值可以用$来表示。来表示。类型属性;类型属性;变量的类型属性定义该变量所保留的字节数。如变量的类型属性定义该变量所保留的字节数。如BYTE(1个字节长个字节长)、WORD(2个字节长个字节长)、DWORD(4个字节长个字节长)、DQ(8个
50、字节长个字节长)、DT(10个字节长个字节长),这一点在数据定义伪操作中已作了说明。这一点在数据定义伪操作中已作了说明。在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。在程序中同样的标号或变量的定义只允许出现一次,否则汇编程序会指示出错。二、操作项二、操作项 操作项可以是指令、伪操作或宏指令的助记符。对于指令,汇编程序将其翻操作项可以是指令、伪操作或宏指令的助记符。对于指令,汇编程序将其翻译为机器语言指令。对于伪操作汇编程序将根据其所要求的功能进行处理。对译为机器语言指令。对于伪操作汇编程序将根据其所要求的功能进行处理。对于宏指令,则将根据其定义展开。这在以后中将专门论述