1、 信息工程学院信息工程学院 电子信息教研室电子信息教研室第第5章章 汇编语言程序设计汇编语言程序设计5.1 汇编语言的特点(了解)汇编语言的特点(了解)5.2 汇编语言程序结构和基本语法(汇编语言程序结构和基本语法(重点重点)5.3 汇编语言程序设计基本方法(汇编语言程序设计基本方法(重点重点)5.4 Windows汇编语言程序设计(自学)汇编语言程序设计(自学)5.5 汇编语言与高级语言的混合编程(自学)汇编语言与高级语言的混合编程(自学)5.1 汇编语言的特点汇编语言的特点u 汇编语言的定义:汇编语言的定义:汇编语言(汇编语言(ASSEMBLY LANGUAGE)是一种以处理器)是一种以处
2、理器指令系统为基础的低级程序设计语言,它采用指令系统为基础的低级程序设计语言,它采用助记符助记符来表示操来表示操作码,用标识符号来表示操作数地址码。作码,用标识符号来表示操作数地址码。u 汇编语言程序特点:汇编语言程序特点:与机器相关;与机器相关;执行效率高;执行效率高;编程复杂。编程复杂。5.2 汇编语言程序结构和基本语法汇编语言程序结构和基本语法 5.2.1 示例程序示例程序 例例5-1:功能:求功能:求C=A+B(A、B、C均为字节数据)。均为字节数据)。在高级语言中,完成某个加法功能,我们可采用语句在高级语言中,完成某个加法功能,我们可采用语句C=A+B,只要给变量,只要给变量A和和B
3、赋一确定值,此加法就可以实现了。赋一确定值,此加法就可以实现了。在在汇编语言中则不同,汇编语言中则不同,程序必须指出程序必须指出A,B存放在何处,相加后的结存放在何处,相加后的结果又存放在何处,然后才能实现这一加法运算。果又存放在何处,然后才能实现这一加法运算。显然,显然,汇编语言在通过程序告诉计算机做什么和如何做时,汇编语言在通过程序告诉计算机做什么和如何做时,显得更加具体。正是这种具体,显得更加具体。正是这种具体,使得该语言与计算机(处理器)紧使得该语言与计算机(处理器)紧密相关,密相关,从而也要求学习和使用汇编语言的人对处理器的结构有更从而也要求学习和使用汇编语言的人对处理器的结构有更加
4、深入的了解。加深入的了解。DATA SEGMENT;定义段;定义段DATA ADB 12H;定义变量;定义变量A,其值为,其值为12H BDB 34H;定义变量;定义变量B,其值为,其值为34H C DB?;定义变量;定义变量C,但没有赋值,但没有赋值DATA ENDS;DATA段定义结束段定义结束 CODE SEGMENT;定义段;定义段CODE ASSUME CS:CODE,DS:DATA;规定;规定DATA、CODE为数据段和代码段为数据段和代码段 START:MOV AX,DATA;用标号;用标号START指明程序执行的起始点指明程序执行的起始点 MOV DS,AX;给数据段寄存器;给
5、数据段寄存器DS赋值赋值 MOV AL,A;将变量;将变量A的值送入寄存器的值送入寄存器AL ADDAL,B;将;将AL的值与变量的值与变量B的值相加,和存入的值相加,和存入AL MOV C,AL;将;将AL的值送给变量的值送给变量C MOV AH,4CH INT21H;调用;调用DOS中断,退出程序并返回中断,退出程序并返回DOS状态状态CODE ENDS;CODE段定义结束段定义结束 ENDSTART;整个源程序结束;整个源程序结束 汇编语言源程序汇编语言源程序由若干个段由若干个段组成(完整的汇编语言源程序由组成(完整的汇编语言源程序由数据段、代码段、附加段、堆栈段组成数据段、代码段、附加
6、段、堆栈段组成,其中代码段是不可缺少,其中代码段是不可缺少的),在的),在代码段中代码段中用用ASSUME伪指令伪指令将段地址与段寄存器的对应将段地址与段寄存器的对应关系告诉汇编程序,关系告诉汇编程序,每个段以每个段以SEGMENT语句开始语句开始,以以ENDS语语句结束句结束,整个源程序以整个源程序以END结束结束。段由若干语句组成,一条语句一般写在一行上,书写时语段由若干语句组成,一条语句一般写在一行上,书写时语句的各部分应尽量对齐。句的各部分应尽量对齐。汇编语言程序中至少要有一个启动标号,作为程序开始执汇编语言程序中至少要有一个启动标号,作为程序开始执行时目标代码的入口地址。行时目标代码
7、的入口地址。启动标号常用启动标号常用START、BEGIN等命等命名名。为增加程序的可读性,可在汇编语言语句为增加程序的可读性,可在汇编语言语句“;”后加上注释。后加上注释。为保证在执行过程中数据段地址的正确性,在为保证在执行过程中数据段地址的正确性,在源程序中需要源程序中需要对对DS寄存器进行初始化。寄存器进行初始化。为了在为了在程序结束时程序结束时返回返回DOS,一般通过调用,一般通过调用DOS中断的中断的4CH子功能来实现。子功能来实现。5.2 汇编语言程序结构和基本语法汇编语言程序结构和基本语法 5.2.2 基本概念基本概念 汇编语言源程序由汇编语言源程序由语句序列语句序列构成。构成。
8、其语句序列可分为其语句序列可分为3种类型:种类型:指令语句指令语句 伪指令语句伪指令语句 宏指令语句宏指令语句u 汇编语言中的语句汇编语言中的语句 即可执行语句(即第即可执行语句(即第4章中介绍的处理器指令系统),在章中介绍的处理器指令系统),在汇编后要产生对应的汇编后要产生对应的目标代码目标代码,CPU根据这些代码执行相应的根据这些代码执行相应的操作。操作。格式:格式:标号:标号:操作数操作数 ;注释;注释 举例:举例:START:MOV AX,DATA ;用标号;用标号START指明程指明程 ;序执行的起始点;序执行的起始点 指令语句指令语句 即不可执行语句,在汇编中即不可执行语句,在汇编
9、中不产生目标代码不产生目标代码,用于指示汇,用于指示汇编程序如何汇编源程序,利用它定义和说明常量和变量的属性编程序如何汇编源程序,利用它定义和说明常量和变量的属性及存储器单元的分配等。及存储器单元的分配等。格式:格式:名字名字 操作数操作数 ;注释;注释 举例:举例:A DB 12H ;定义变量;定义变量A,其值为,其值为12H 伪指令语句(结合伪指令语句(结合5.2.3)即以一个即以一个宏名定义宏名定义的一段指令序列,在汇编中凡是出现宏的一段指令序列,在汇编中凡是出现宏指令语句的地方,都会有相应的指令语句序列的目标代码插入。指令语句的地方,都会有相应的指令语句序列的目标代码插入。格式:格式:
10、标号:标号:实参表实参表 ;注释;注释 宏指令语句(结合宏指令语句(结合5.2.5)标号和名字称为标号和名字称为标识符标识符,汇编语言中标识符的组成规则如下:,汇编语言中标识符的组成规则如下:标识符由字母、数字及规定的特殊符号(如标识符由字母、数字及规定的特殊符号(如 _、$、?、)组成;)组成;标识符必须以字母打头;标识符必须以字母打头;标识符字符长度不得超过标识符字符长度不得超过31;默认情况下,汇编程序不区别标识符中字母的大小写;默认情况下,汇编程序不区别标识符中字母的大小写;用户定义标识符必须是唯一的,且不能与汇编语言专用的保留字重名。用户定义标识符必须是唯一的,且不能与汇编语言专用的
11、保留字重名。标号用来指向一条指令或宏指令,表示后面的指令第一个字节存放的内标号用来指向一条指令或宏指令,表示后面的指令第一个字节存放的内存地址,标号常作为转移指令的操作数,确定程序转移的目标地址;名字用存地址,标号常作为转移指令的操作数,确定程序转移的目标地址;名字用来指向一条伪指令,用作变量名时,表示变量存放在内存中首字节的地址。来指向一条伪指令,用作变量名时,表示变量存放在内存中首字节的地址。指令的指令的操作数操作数可以是立即数、寄存器和存储单元;伪指令的操作数可以可以是立即数、寄存器和存储单元;伪指令的操作数可以是常数、变量名、表达式等;若有多个操作数时,操作数之间用逗号间隔。是常数、变
12、量名、表达式等;若有多个操作数时,操作数之间用逗号间隔。由分号由分号“;”后的部分为注释内容,用以增加源程序的可读性,汇编程后的部分为注释内容,用以增加源程序的可读性,汇编程序序在翻译源程序时将跳过该部分,对它们不做任何处理。在翻译源程序时将跳过该部分,对它们不做任何处理。u 汇编语句使用说明汇编语句使用说明 名字和标号都具有名字和标号都具有3种属性:种属性:段属性:段属性:表示标号或变量所在段基址,标号的段基址在表示标号或变量所在段基址,标号的段基址在CS段寄存器中,变量的段基址在段寄存器中,变量的段基址在DS或或ES中。中。偏移属性偏移属性:表示标号或变量所在的段内偏移地址,它代表:表示标
13、号或变量所在的段内偏移地址,它代表从段的起始地址到定义标号或变量的位置之间的字节数,段基址从段的起始地址到定义标号或变量的位置之间的字节数,段基址和偏移地址组成标号或变量的逻辑地址。和偏移地址组成标号或变量的逻辑地址。类型属性类型属性:当标号作为转移类指令的操作数时,可在段内或:当标号作为转移类指令的操作数时,可在段内或段间转移,其属性有段间转移,其属性有NEAR(段内转移)和(段内转移)和FAR(段间转移)(段间转移)2种,若没有对标号进行类型说明,就默认为种,若没有对标号进行类型说明,就默认为NEAR属性;对于变属性;对于变量,类型属性说明变量在内存中占多少个字节,其属性有量,类型属性说明
14、变量在内存中占多少个字节,其属性有BYTE(字节)、(字节)、WORD(字)、(字)、DOUBLE WORD(双字)(双字)3种。种。u 汇编语句使用说明(续)汇编语句使用说明(续)u 汇编语言中的常量与变量汇编语言中的常量与变量 常量常量:汇编中允许的常量有:汇编中允许的常量有整数常量整数常量和和字符串常量字符串常量两种。两种。变量变量:汇编语言中的变量用来表示:汇编语言中的变量用来表示存放在内存中操作数存放在内存中操作数,它,它的值是可以改变的,变量的值就是操作数在内存中首字节的地的值是可以改变的,变量的值就是操作数在内存中首字节的地址,址,变量要事先定义才能使用变量要事先定义才能使用。对
15、于变量,类型属性说明变量在。对于变量,类型属性说明变量在内存中占多少个字节,其属性有内存中占多少个字节,其属性有BYTE(字节)、(字节)、WORD(字)、(字)、DOUBLE WORD(双字)(双字)3种。种。整数常量可以采用整数常量可以采用4种表示方法:种表示方法:二进制常量:由数字二进制常量:由数字0、1组成的序列,且以字母组成的序列,且以字母B结尾。结尾。十进制常量:由数字十进制常量:由数字09组成的序列,结尾可以加上字母组成的序列,结尾可以加上字母D。八进制常量:由数字八进制常量:由数字07组成的序列,且以字母组成的序列,且以字母Q(或字母或字母O)结尾。结尾。十六进制常量:由数字十
16、六进制常量:由数字09、字母、字母AF(或(或AF)组成的)组成的序列,以字母序列,以字母H结尾。结尾。(为了避免与标识符相混淆,十六进制数在为了避免与标识符相混淆,十六进制数在语句中语句中 必须以数字打头,凡是以字母必须以数字打头,凡是以字母AF开始的十六进制数,必开始的十六进制数,必须在前面加上数字须在前面加上数字0)。常量常量-整数常量整数常量 字符串常量是由字符串常量是由单引号或双引号单引号或双引号括起来的单个字符或多个括起来的单个字符或多个字符构成的。汇编程序把引号中的字符翻译成它的字符构成的。汇编程序把引号中的字符翻译成它的ASCII码值。码值。如:如:A(等于(等于41H)、)、
17、BC(等于(等于4243H)、)、“HELLO”等。等。常量常量字符串常量字符串常量u 汇编语言中的运算符与表达式汇编语言中的运算符与表达式 运算符:汇编中的运算符分为运算符:汇编中的运算符分为6大类,它们是:大类,它们是:算术运算符算术运算符、移位运算符移位运算符、逻辑运算符逻辑运算符、关系运算符关系运算符、分析运算符分析运算符、合成运算合成运算符(见课本符(见课本P131表表5-1)。表达式:表达式是常数、寄存器、标号、变量与一些运算表达式:表达式是常数、寄存器、标号、变量与一些运算符和操作码相组合的序列。符和操作码相组合的序列。表达式的运算不由表达式的运算不由CPU完成,而是在程序汇编过
18、程中进行完成,而是在程序汇编过程中进行计算确定,并将表达式的结果作为操作数参与指令所规定的操计算确定,并将表达式的结果作为操作数参与指令所规定的操作。作。当各种运算符同时出现在同一表达式中时,按照运算符的当各种运算符同时出现在同一表达式中时,按照运算符的优先级优先级进行计算,对于优先级相同的运算符,按照从左到右的进行计算,对于优先级相同的运算符,按照从左到右的顺序进行计算顺序进行计算(见课本(见课本P132表表5-2)。数值表达式数值表达式:由数值和运算符组成,产生一个数值结果,:由数值和运算符组成,产生一个数值结果,只有大小,没有属性。只有大小,没有属性。地址表达式地址表达式:由指令寻址方式
19、中简单的地址表达式和特殊:由指令寻址方式中简单的地址表达式和特殊算符组成,其结果是一个表示存储器地址的变量或标号。算符组成,其结果是一个表示存储器地址的变量或标号。补补 充充 知知 识识-表达式的分类表达式的分类u 特殊算符(见课本特殊算符(见课本P131表表5-1)取偏移地址算符取偏移地址算符 OFFSET 取段地址算符取段地址算符 SEG 例如:例如:MOV AX,SEG DATA MOV DS,AX 取类型算符取类型算符 TYPE(结合课本(结合课本P135表表5-3)取变量个数算符取变量个数算符 LENGTH 取变量字节数算符取变量字节数算符 SIZE 合成算符合成算符PTR:类型:类
20、型 PTR OPRD 合成算符合成算符THIS 短标号算符短标号算符SHORT 字节分离算符字节分离算符HIGH和和LOWDATA SEGMENT VAR DW?ARRAY DD 10 DUP(?)STR DB THIS IS A TESTDATA ENDS :MOV AX,TYPE VAR MOV BX,TYPE ARRAY MOV CX,TYPE STR;AX=2;BX=4;CX=1补充例题补充例题5.2 汇编语言程序结构和基本语法汇编语言程序结构和基本语法 5.2.3 伪指令伪指令 汇编语言中有丰富的伪指令。依其功能可将其汇编语言中有丰富的伪指令。依其功能可将其分为分为数据定义伪指令数据
21、定义伪指令、符号定义伪指令符号定义伪指令、段定义伪段定义伪指令指令、段分配伪指令段分配伪指令、过程定义伪指令过程定义伪指令、模块定义模块定义伪指令伪指令、结构定义伪指令结构定义伪指令和和记录定义伪指令记录定义伪指令等。等。u 数据定义伪指令数据定义伪指令 功能:用来为变量申请固定长度的存储空间,并可同时功能:用来为变量申请固定长度的存储空间,并可同时将相应的存储单元初始化。将相应的存储单元初始化。格式:格式:变量名变量名 伪指令助记符伪指令助记符 初值表初值表 变量名为用户自定义标识符,表示初值表中首个元素的逻变量名为用户自定义标识符,表示初值表中首个元素的逻辑地址,可以通过变量名来访问它所指
22、示的存储单元,有时辑地址,可以通过变量名来访问它所指示的存储单元,有时也可以省略变量名。也可以省略变量名。变量名变量名 DB:定义:定义字节字节变量,即其后的每个操作数均占变量,即其后的每个操作数均占1个字节;个字节;DW:定义:定义字字变量,即其后的每个操作数均占变量,即其后的每个操作数均占2个字节;个字节;DD:定义:定义双字双字变量,即其后的每个操作数均占变量,即其后的每个操作数均占4个字节;个字节;DQ:定义:定义4字变量,即其后的每个操作数均占字变量,即其后的每个操作数均占8个字节;个字节;DT:定义:定义10字节变量,即其后的每个操作数均占字节变量,即其后的每个操作数均占10个字节
23、。个字节。注意:注意:存放多字节数据时,数据高字节存放在高地址单元,低字存放多字节数据时,数据高字节存放在高地址单元,低字节存放在低地址单元。节存放在低地址单元。变量定义伪指令变量定义伪指令 初值表给出变量的初始化值,有多个值时用逗号分隔。初值表给出变量的初始化值,有多个值时用逗号分隔。初始化值可以是数值常数,也可以是表达式、?,还可以初始化值可以是数值常数,也可以是表达式、?,还可以由由$、重复操作符、重复操作符DUP组成。其中:组成。其中:?表示未赋初值;?表示未赋初值;$表示将要分配的内存单元的偏移地址;表示将要分配的内存单元的偏移地址;DUP表示重复初值。表示重复初值。格式为:重复次数
24、格式为:重复次数 DUP(重复参数)(重复参数)说明:重复参数可以是多个,之间用逗号间隔。说明:重复参数可以是多个,之间用逗号间隔。举例:举例:2 DUP(1,2);等价于;等价于1,2,1,2 初值表初值表 补充知识补充知识-如何给变量赋初值?如何给变量赋初值?常数或数值表达式。常数或数值表达式。ASCII码字符串:但只有码字符串:但只有DB定义时,才允许超过定义时,才允许超过2个字符。个字符。地址表达式(变量名或标号):仅适合地址表达式(变量名或标号):仅适合DW和和DD。用用DW时,取地址表达式所在地址的偏移量赋给变量。时,取地址表达式所在地址的偏移量赋给变量。用用DD时,取地址表达式所
25、在的段地址和偏移量赋给变量。时,取地址表达式所在的段地址和偏移量赋给变量。?:表示定义的变量无确定值。?:表示定义的变量无确定值。重复子句:格式为:重复子句:格式为:n DUP(表达式)。(表达式)。可以是以上表达式的组合,表达式之间用逗号隔开。可以是以上表达式的组合,表达式之间用逗号隔开。注意:注意:等价伪指令等价伪指令EQU,当放在数据段中时,不占内存。,当放在数据段中时,不占内存。对于有符号数,应以对于有符号数,应以补码补码形式在内存中存放。形式在内存中存放。DATA SEGMENTDA1 DB 01H,12H DA2 DW 1234H DA3 DD 56789012HDATA ENDS
26、变量名变量名偏移地址偏移地址 单元数据单元数据DA10000H01HDA2DA30001H0002H0003H0004H0005H0006H0007H12H34H12H12H90H78H56H补充例题补充例题DATA SEGMENT BUF DB AB,0DH,0AH A DW M B DW 0FFAAH C DD BUF M DB 2 DUP(2,B),),12,1,2DATA ENDS补充例题补充例题设设DS=0AC0H,数据存储形式如下:,数据存储形式如下:变量名变量名偏移地址偏移地址单元数据单元数据变量名变量名偏移地址偏移地址单元数据单元数据BUFABC0000H0001H0002H0
27、003H0004H0005H0006H0007H0008H0009H000AH 000BH000CH 000DH 000EH000FH0010H0011H0012H0013H02H42H02H42H31H32H01H02H41H42H0DH 0AH00H AAH FFH00H00HC0H 0AHM0CHu 起始位置定位伪指令起始位置定位伪指令ORG 功能:在数据段内一般从偏移地址为功能:在数据段内一般从偏移地址为0的存储单元开的存储单元开始,依次按顺序分配内存单元;使用始,依次按顺序分配内存单元;使用ORG可以指定从某一可以指定从某一个偏移地址开始分配内存单元。个偏移地址开始分配内存单元。格式
28、格式1:ORG*H 格式格式2:ORG 表达式表达式 ;从表达式的值指定的偏移地址,;从表达式的值指定的偏移地址,;开始分配的内存单元。;开始分配的内存单元。例例5-3:DATA SEGMENT X DB 64*2-100,D DB CHN DW?ORG 0100H Y DW 2 DUP(100)M DB 2 DUP(1,2 DUP(1,2)Z DW$-10 DATA ENDSu 符号定义伪指令符号定义伪指令 功能:用来定义符号常量,功能:用来定义符号常量,系统不会给符号常量分配内存空间系统不会给符号常量分配内存空间。指令有指令有EQU(等价伪指令)(等价伪指令)、=(等号伪指令)(等号伪指令
29、)。格式:格式:符号符号 EQU 表达式表达式 符号符号=表达式表达式 ;左边符号的值为右边表达式的值。;左边符号的值为右边表达式的值。说明:说明:两者的区别是两者的区别是用用“=”定义的符号常量可以被重新定义定义的符号常量可以被重新定义,而用,而用EQU定义的符号常量则不能被重新定义定义的符号常量则不能被重新定义。u LABEL伪指令伪指令 功能:为其后定义的变量或标号定义一个不同类型的别名。功能:为其后定义的变量或标号定义一个不同类型的别名。格式:格式:变量或标号变量或标号 LABEL 类型类型 说明:说明:类型为类型为BYTE、WORD、DWORD、NEAR或或FAR。例例5-6:VAR
30、LABEL WORD XDB AB;变量;变量VAR、X指向内存中的同一单元,指向内存中的同一单元,;但两者类型分别为字类型、字节类型;但两者类型分别为字类型、字节类型MOV AX,VAR;等价于;等价于MOV AX,4241HMOV AL,X;等价于;等价于MOV AL,41Hu 段定义伪指令段定义伪指令 汇编语言源程序由若干个段组成,段定义伪指令汇编语言源程序由若干个段组成,段定义伪指令(SEGMENT/ENDS)用来定义一个段,要求给出段名,由)用来定义一个段,要求给出段名,由SEGMENT指定段的开始,指定段的开始,ENDS指定段的结束。指定段的结束。格式为:格式为:段名段名 SEGM
31、ENT 定位类型定位类型 组合类型组合类型 类别类别 ;语句序列;语句序列 段名段名 ENDSu 说明说明1、SEGMENT和和ENDS必须成对出现。必须成对出现。2、段名由用户自己命名,须符合标识符命名规则,前后段名必、段名由用户自己命名,须符合标识符命名规则,前后段名必 须保持一致。须保持一致。每个段的段名即为该段的段基址每个段的段名即为该段的段基址。3、定位类型定位类型用来说明对段起始地址的要求,可以省略。定位类用来说明对段起始地址的要求,可以省略。定位类型有以下型有以下4种:种:BYTE:段的起始地址可在任意字节边界上。即段起始地址:段的起始地址可在任意字节边界上。即段起始地址是任意的
32、;是任意的;WORD:要求段的起始地址在任意字边界上。即段起始地址:要求段的起始地址在任意字边界上。即段起始地址 最低位为最低位为0,亦即段起始地址必须为偶地址;,亦即段起始地址必须为偶地址;PARA:要求段的起始地址在:要求段的起始地址在节节(16字节)的边界上,即字节)的边界上,即 段段起始地址低起始地址低4位全部为位全部为0,如:,如:XXXX0H。缺省定位类型时,默认。缺省定位类型时,默认为为PARA类型;类型;PAGE:要求段的起始地址在页(:要求段的起始地址在页(256字节)边界上,即段起字节)边界上,即段起始地址低始地址低8位全部为位全部为0,如:,如:XXX00H。补充例题补充
33、例题STACK SEGMENT DB 100 DUP(?)(?)STACK ENDSDATA1 SEGMENT BYTE STRING DB This is an example.DATA1 ENDSDATA2 SEGMENT WORD BUFFER DW 40 DUP(0)DATA2 ENDCODE1 SEGMENT PAGECODE1 ENDSCODE2 SEGMENT START:MOV AX,STACK MOV SS,AXCODE2 ENDSEND START各逻辑段的起始地址和结束地址各逻辑段的起始地址和结束地址段名段名定位类型定位类型字节数字节数起始地址起始地址结束地址结束地址ST
34、ACKPARA100(64H)00000H00063HDATA1BYTE19(13H)00064H00076HDATA2WORD80(50H)00078H000C7HCODE1PAGE13(0DH)00100H0010CHCODE2PARA52(34H)00110H00143H4、组合类型用来说明同类别名的段的连接方式,可以省略。、组合类型用来说明同类别名的段的连接方式,可以省略。组合类型有以下组合类型有以下6种:种:NONE:不与其他段连接。缺省组合类型时,默认为:不与其他段连接。缺省组合类型时,默认为NONE类型;类型;PUBLIC:将不同程序模块中同名同类型的段按顺序连接成:将不同程序模
35、块中同名同类型的段按顺序连接成一个共同的段装入内存;一个共同的段装入内存;STACK:指定该段为堆栈段,并将不同程序模块中的堆栈段:指定该段为堆栈段,并将不同程序模块中的堆栈段按顺序连接成一个堆栈段。即所有程序模块共用一个堆栈段;按顺序连接成一个堆栈段。即所有程序模块共用一个堆栈段;COMMON:将不同程序模块中同名同类型的段都从同一个:将不同程序模块中同名同类型的段都从同一个地址开始装入,即以覆盖方式连接,各个逻辑段将发生重叠,段地址开始装入,即以覆盖方式连接,各个逻辑段将发生重叠,段长度为最大段的长度;长度为最大段的长度;AT 表达式:按照表达式的值指定的段基址将段装入内存;表达式:按照表
36、达式的值指定的段基址将段装入内存;MEMORY:多个逻辑段连接时,连接程序将把本段连接在其:多个逻辑段连接时,连接程序将把本段连接在其他所有段之上。若多个段均为他所有段之上。若多个段均为MEMORY类型时,则将第一个类型时,则将第一个MEMORY段至于所有段之上,其他段至于所有段之上,其他MEMORY段当成段当成COMMON类型来处理。类型来处理。u 说明(续)说明(续)5、类别名类别名必须用必须用引起来,用来说明该段类别名,在连接引起来,用来说明该段类别名,在连接时时将同类别名的段按照组合类型进行组合。将同类别名的段按照组合类型进行组合。说明:说明:类别名由用户自定义,长度不超过类别名由用户
37、自定义,长度不超过40个字符。个字符。类别名是在连接时决定各逻辑段的装入顺序。当几个类别名是在连接时决定各逻辑段的装入顺序。当几个程程序模块序模块进行连接时,其中具有相同类别名的逻辑段被装入连进行连接时,其中具有相同类别名的逻辑段被装入连续的内存区,类别名相同的逻辑段,按出现的先后顺序排列。续的内存区,类别名相同的逻辑段,按出现的先后顺序排列。没有类别名的逻辑段,与其他无类别名的逻辑段一起连续装没有类别名的逻辑段,与其他无类别名的逻辑段一起连续装入内存。入内存。u 说明(续)说明(续)补充例题补充例题假设一个主程序中有假设一个主程序中有5个逻辑段,段名和类别名分别为:个逻辑段,段名和类别名分别
38、为:STK1 SEGMENT STACK CODE1 SEGMENT DATA1 SEGMENT BUFFER DATA2 SEGMENT TABLE DATA3 SEGMENT BUFFER还有一个子程序,包括还有一个子程序,包括4个逻辑段,段名和类别名分别为:个逻辑段,段名和类别名分别为:DATA4 SEGMENT TABLE DATA5 SEGMENT BUFFER STK2 SEGMENT STACK CODE2 SEGMENT 当将两个程序进行连接时,两个程序模块中各个逻辑段装当将两个程序进行连接时,两个程序模块中各个逻辑段装入内存的顺序:入内存的顺序:BUFFERDATA3TABL
39、EDATA2BUFFERDATA1无无CODE1STACKSTK1类别名类别名段名段名主程序主程序无无CODE2STACKSTK2BUFFERDATA5TABLEDATA4类别名类别名段名段名子程序子程序内存内存DATA4DATA2DATA5DATA3DATA1CODE2CODE1STK2STK1STACK无无BUFFERTABLEu 段分配伪指令段分配伪指令 功能:用来说明当前哪些逻辑段为代码段、哪些为数据段、哪些为堆栈段、功能:用来说明当前哪些逻辑段为代码段、哪些为数据段、哪些为堆栈段、哪些为附加段。哪些为附加段。格式为:格式为:ASSUME 段寄存器:段名段寄存器:段名,段寄存器:段名,
40、段寄存器:段名,说明:说明:ASSUME伪指令只能设置在伪指令只能设置在代码段代码段内,内,放在段定义语句之后放在段定义语句之后。ASSUME伪指令只是建立了逻辑段与段寄存器之间的关系,伪指令只是建立了逻辑段与段寄存器之间的关系,并没有为段寄并没有为段寄存器赋值存器赋值。对于代码段和堆栈段,由连接程序来设置。对于代码段和堆栈段,由连接程序来设置CS、IP、SS、SP的值;的值;而而数据段和附加段则需要由用户在程序中对数据段和附加段则需要由用户在程序中对DS、ES赋值。赋值。每个段的段名即为该段的段基址,它是一个每个段的段名即为该段的段基址,它是一个16位的立即数,因此不能直接位的立即数,因此不
41、能直接将它送给段寄存器,通常先将段名送给一个通用寄存器,然后将该通用寄存器将它送给段寄存器,通常先将段名送给一个通用寄存器,然后将该通用寄存器的值再送给段寄存器,的值再送给段寄存器,来对来对DS、ES赋值赋值(由由MOV指令来完成指令来完成)。)。例如:例如:MOV AX,DATA MOV DS,AXu 过程定义伪指令过程定义伪指令 对于程序中经常用到的具有独立功能的语句组,可将它定义对于程序中经常用到的具有独立功能的语句组,可将它定义成一个子过程,通过成一个子过程,通过CALL来调用执行,可以简化主程序,实现来调用执行,可以简化主程序,实现模块化程序设计,提高编程效率。模块化程序设计,提高编
42、程效率。格式:格式:过程名过程名 PROC 属性属性 ;语句序列;语句序列 RET 过程名过程名 ENDP1、过程名由用户自己命名,但必须符合标识符命名规则,前后过、过程名由用户自己命名,但必须符合标识符命名规则,前后过程名必须保持一致。过程名代表过程的入口地址。程名必须保持一致。过程名代表过程的入口地址。2、PROC指定过程的开始,指定过程的开始,ENDP指定过程的结束,指定过程的结束,PROC和和ENDP必须成对出现。必须成对出现。3、属性属性:过程属性有:过程属性有NEAR(段内近调用)、(段内近调用)、FAR(段间远调(段间远调用)两种,若缺省则为用)两种,若缺省则为NEAR。NEAR
43、属性的过程只能被本代码属性的过程只能被本代码段内的其他程序调用;段内的其他程序调用;FAR属性的过程既可以被本代码段内的属性的过程既可以被本代码段内的程序调用,又可以被其他代码段内的程序调用。程序调用,又可以被其他代码段内的程序调用。4、过程必须以、过程必须以RET结尾以便返回调用它的程序。结尾以便返回调用它的程序。5、子过程应安排在代码段的主程序之外,最好放在主程序执行终子过程应安排在代码段的主程序之外,最好放在主程序执行终止后的位置(返回止后的位置(返回DOS后、汇编结束后、汇编结束END伪指令前),也可以放伪指令前),也可以放在主程序开始执行之前的位置。在主程序开始执行之前的位置。u 说
44、明说明 补充知识补充知识-模块定义与连接伪指令模块定义与连接伪指令 在编写规模较大的汇编语言源程序时,可以将整个程序在编写规模较大的汇编语言源程序时,可以将整个程序划分为几个独立的源程序,称之为划分为几个独立的源程序,称之为模块模块。格式:格式:NAME 模块名;指定模块名模块名;指定模块名 说明:说明:1、NAME的前面不允许再加上标号。的前面不允许再加上标号。2、如果程序中没有、如果程序中没有NAME伪指令,则汇编程序将伪指令,则汇编程序将TITLE伪指令伪指令后面后面“标题名标题名”中的前六个字符作为模块名。中的前六个字符作为模块名。3、如果源程序中既没有使用、如果源程序中既没有使用NA
45、ME,也没有使用,也没有使用TITLE伪指令,伪指令,则汇编程序将源程序的文件名作为目标程序的模块名。则汇编程序将源程序的文件名作为目标程序的模块名。4、将各模块分别进行汇编,生成各自的目标程序,最后将它们将各模块分别进行汇编,生成各自的目标程序,最后将它们连接成为一个完整的可执行程序。连接成为一个完整的可执行程序。u 全局标识符伪指令全局标识符伪指令 采用模块化程序设计,各模块之间会存在着数据的采用模块化程序设计,各模块之间会存在着数据的交流,即在一个模块中需要引用在另一个模块中定义的变交流,即在一个模块中需要引用在另一个模块中定义的变量、标号、或过程。量、标号、或过程。模块中的标识符有两种
46、:模块中的标识符有两种:局部标识符局部标识符:仅供本模块使用的标识符;:仅供本模块使用的标识符;全局标识符全局标识符:既可供本模块使用,又可供另外的模块:既可供本模块使用,又可供另外的模块使用的标识符。使用的标识符。全局标识符定义伪指令全局标识符定义伪指令 要想让其它模块能调用本要想让其它模块能调用本模块模块中的标识符,就需要在本模块中中的标识符,就需要在本模块中将该标识符定义为全局标识符。将该标识符定义为全局标识符。格式:格式:PUBLIC 标识符标识符1,标识符,标识符2,全局标识符声明伪指令全局标识符声明伪指令:要想在本模块中调用其它模块里的全局标识符,需要用要想在本模块中调用其它模块里
47、的全局标识符,需要用EXTRN进行声明。进行声明。格式:格式:EXTRN 标识符标识符1:类型,标识符:类型,标识符2:类型,:类型,说明:说明:类型可为类型可为BYTE、WORD、DWORD、NEAR或或FAR。某个主模块需调用一个过程某个主模块需调用一个过程SBRT,并引用变量,并引用变量ALPHA和和BETA,而上述过程和变量在另外两个子模块中定义,则主模,而上述过程和变量在另外两个子模块中定义,则主模块中应使用块中应使用EXTRN伪指令将有关过程和变量说明为外部的;而伪指令将有关过程和变量说明为外部的;而在相应的子模块中用在相应的子模块中用PUBLIC伪指令将它们说明为公共的。同时,伪
48、指令将它们说明为公共的。同时,由于被调用的过程与调用它的主程序不在同一段中,因此过程由于被调用的过程与调用它的主程序不在同一段中,因此过程的类型应该定义为的类型应该定义为FAR。补充例题补充例题DATA1 SEGMENT BUFFER DW 100 DUP(?)DATA1 ENDSDATA2 SEGMENT PUBLIC;该段的组合类型为;该段的组合类型为PUBLIC EXTRN ALPHA:BYTE,BETA:WORD DATA2 ENDSCODE1 SEGMENT EXTRN SBRT FAR ASSUME CS:CODE1,DS:DATAl,ES:DATA2 START:MOV AX,D
49、ATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX CALL SBRTCODE1 ENDS END START主模块主模块PUBLIC SBRTCODE2 SEGMENT ASSUME CS:CODE2 SBRT PROC FAR SBRTENDPCODE2 ENDS ENDDATA2 SEGMENT PUBLIC PUBLIC ALPHA,BETA ALPHADB 50 DUP (?)BETA DW?DATA2ENDSEND子模块子模块1子模块子模块2 功能:表示程序的结束,汇编程序遇到功能:表示程序的结束,汇编程序遇到END时结束汇编,时结束汇编,其后的标号为程序执
50、行的起始地址。其后的标号为程序执行的起始地址。格式:格式:END 标号标号 u 程序结束伪指令程序结束伪指令5.2 汇编语言程序结构和基本语法汇编语言程序结构和基本语法 5.2.4 结构与记录结构与记录-结构结构 当程序中的数据是由多个数据成员组成时,如:学生信息表当程序中的数据是由多个数据成员组成时,如:学生信息表中的学生数据,包含学号、姓名、性别、年龄等多个成员数据,中的学生数据,包含学号、姓名、性别、年龄等多个成员数据,若用前面的方式来定义多个学生数据就比较麻烦。若用前面的方式来定义多个学生数据就比较麻烦。8086宏汇编提宏汇编提供了结构(供了结构(STRUCTURES)来实现对这种数据