《《汇编语言程序》PPT课件.ppt》由会员分享,可在线阅读,更多相关《《汇编语言程序》PPT课件.ppt(122页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章第四章 汇编语言程序格式汇编语言程序格式教学要点:教学要点:u理解汇编语言的基本格式理解汇编语言的基本格式u掌握汇编语言中的数据类型、运算符、表达式掌握汇编语言中的数据类型、运算符、表达式 的表示方法和作用的表示方法和作用u掌握伪指令的格式和作用掌握伪指令的格式和作用u理解汇编语言源程序的结构理解汇编语言源程序的结构u了解汇编语言的上机过程了解汇编语言的上机过程1 汇编语言是面向机器的低级程序设计语言。是一汇编语言是面向机器的低级程序设计语言。是一种符号语言,它用指令的助记符,符号地址,标号等种符号语言,它用指令的助记符,符号地址,标号等各种符号来书写程序。各种符号来书写程序。汇编语言有
2、自汇编程序、交叉汇编程序。汇编语言有自汇编程序、交叉汇编程序。汇编语言直观易读,直接控制硬件的最底层。汇编语言直观易读,直接控制硬件的最底层。24.1 汇编语言语句种类及其格式汇编语言语句种类及其格式 不同的汇编程序有不同的汇编语言编程规定。目前支不同的汇编程序有不同的汇编语言编程规定。目前支持持Intel8086/8088系列微机,常用的汇编程序有系列微机,常用的汇编程序有ASM、MASM、TASM、OPTASM等等。用汇编语言编写程序,首先要了解汇编语言的语法规则用汇编语言编写程序,首先要了解汇编语言的语法规则和语句格式,和语句格式,“语句语句”是源程序的基本单位。是源程序的基本单位。本章
3、主要介绍本章主要介绍汇编语言程序设计中的一些基本书写格式与语法规则。汇编语言程序设计中的一些基本书写格式与语法规则。汇编语言的语句可以分为汇编语言的语句可以分为指令语句指令语句、伪指令语句伪指令语句和和宏指令宏指令语句语句(宏调用语句)。(宏调用语句)。3 指令语句是可执行的,在汇编时都要产生一个可供指令语句是可执行的,在汇编时都要产生一个可供CPU执执行的机器目标代码。例:行的机器目标代码。例:INC AX一、指令语句一、指令语句指令语句的一般格式为:指令语句的一般格式为:名字名字操作码操作码操作数操作数注释注释;:,一条指令语句最多可以包含一条指令语句最多可以包含4个字段个字段4名字是可选
4、字段名字是可选字段,它后面,它后面必须有必须有“:”。名字是一条指令的名字是一条指令的符号地址,代表了该指令的第一个字节存放地址。符号地址,代表了该指令的第一个字节存放地址。1.名字名字名字一般放在一个程序段或子程序的入口处,控制程序的执名字一般放在一个程序段或子程序的入口处,控制程序的执行转到该程序位置。行转到该程序位置。例:例:ADDR1:MOV AL,100在转移指令或子程序调用指令中,可直接引用这个名字。在转移指令或子程序调用指令中,可直接引用这个名字。5在汇编语言中,允许使用如下字符做为名字:在汇编语言中,允许使用如下字符做为名字:字母:字母:a-z,A-Z数字:数字:0-9字符:?
5、字符:?;._$:,名字是一个字符串序列,最多包含名字是一个字符串序列,最多包含31个字符。个字符。名字可以作为标号或者是变量。名字可以作为标号或者是变量。6该字段是一条指令的必选项该字段是一条指令的必选项,它表示这条语句要求,它表示这条语句要求CPU完成完成什么具体操作,如什么具体操作,如MOV、ADD、SHL等。等。为语句的核心成分,为语句的核心成分,表示了该语句的操作类型。表示了该语句的操作类型。2.操作码操作码有些指令还可以在指令助记符的前面加上前缀,实现一定的有些指令还可以在指令助记符的前面加上前缀,实现一定的附加操作。如串操作指令前所加的重复前缀附加操作。如串操作指令前所加的重复前
6、缀REP等。等。7操作数有一个或者多个表达式组成。操作数有一个或者多个表达式组成。一条指令可以有一个操一条指令可以有一个操作数、两个操作数或者无操作数。作数、两个操作数或者无操作数。3.操作数字段操作数字段如如ADD、MOV指令需要两个操作数,指令需要两个操作数,INC、NOT指令只需指令只需一个操作数,而一个操作数,而CLC指令不需要操作数。指令不需要操作数。操作数可以是常数,寄存器,标号,或者表达式组成。操作数可以是常数,寄存器,标号,或者表达式组成。84.注释字段注释字段例:例:LABEL1:ADD AX,BX;功能为;功能为AXMOV AX,0FF0FHMOV AL,NOT 0F0H
7、=MOV AL,0FHMOV BL,55H AND 0F0H=MOV BL,50HMOV BH,55H OR 0F0H =MOV BH,0F5HMOV CL,55H XOR 0F0H=MOV CL,0A5H68三、关系运算符三、关系运算符关系运算符包括:关系运算符包括:EQ(等于)、(等于)、NE(不等于)、(不等于)、LT(小(小于)、于)、LE(小于等于)、(小于等于)、GT(大于)、(大于)、GE(大于等于)(大于等于)关系运算符用于比较两个表达式的大小。关系运算符比关系运算符用于比较两个表达式的大小。关系运算符比较的两个表达式必须同为常数或同一逻辑段中的变量。较的两个表达式必须同为常数
8、或同一逻辑段中的变量。如果是常量的比较,则按无符号数进行比较;如果是变如果是常量的比较,则按无符号数进行比较;如果是变量的比较,则比较它们的偏移量的大小。量的比较,则比较它们的偏移量的大小。69关系运算的结果只能是关系运算的结果只能是“真真”(全(全1)或)或“假假”(全(全0)MOV AX,0FH EQ 1111B=MOV AX,0FFFFHMOV BX,0FH NE 1111B=MOV BX,0例例1:VAR DW NUM LT 0ABH该语句在汇编时,根据符号常量该语句在汇编时,根据符号常量NUM的大小来决定的大小来决定VAR存储单元的值,当存储单元的值,当NUM0ABH时,则变量时,则
9、变量VAR的内容为的内容为0FFFFH,否则,否则VAR的内容为的内容为0。例例270四、数值返回运算符四、数值返回运算符该类运算符有该类运算符有5个,它们将变量或标号的某些特征值或存储个,它们将变量或标号的某些特征值或存储单元地址的一部分提取出来。单元地址的一部分提取出来。取变量或标号所在段的段基值。取变量或标号所在段的段基值。1.SEG运算符运算符DATA SEGMENT K1 DW 1,2 K2 DW 3,4 MOV AX,SEG K1MOV BX,SEG K2设设DATA逻辑段的段基值为逻辑段的段基值为1FFEH,则两条传送指令将,则两条传送指令将被汇编为:被汇编为:MOV AX,1F
10、FEHMOV BX,1FFEH作用作用71该运算符的作用是取变量或标号在段内的偏移量。该运算符的作用是取变量或标号在段内的偏移量。2.OFFSET运算符运算符DATA SEGMENT VAR1 DB 20H DUP(0)VAR2 DW 5A49H ADDR DW VAR2 ;将将VAR2的偏移量的偏移量20H存入存入ADDR中中 .MOV BX,VAR2 ;(BX)=5A49H MOV SI,0FFSET VAR2 ;(SI)=20H MOV DI,ADDR ;DI的内容与的内容与SI相同相同 MOV BP,OFFSET ADDR ;(BP)=22H72该运算符的作用为取变量或标号的类型属性,
11、并用数字形该运算符的作用为取变量或标号的类型属性,并用数字形式来表示。对变量来说就是取它的字节长度。式来表示。对变量来说就是取它的字节长度。3.TYPE运算符运算符变量变量BYTE 1WORD 2DWORD 4标号标号NEAR -1FAR -2V1 DB ABCDEV2 DW 1234H,5678HV3 DD V2 ;存放存放V2的段基值和偏移量的段基值和偏移量 MOV AL,TYPE V1 MOV CL,TYPE V2 MOV CH,TYPE V3上述程序段汇编后的等效指令序列如下:上述程序段汇编后的等效指令序列如下:MOV AL,01HMOV CL,02HMOV CH,04H73该运算符只
12、能加在变量的前面。该运算符只能加在变量的前面。如果变量是用重复数据操如果变量是用重复数据操作符作符DUP说明的,则返回外层说明的,则返回外层DUP给定的值。如果没有用给定的值。如果没有用DUP说明,则返回值总是说明,则返回值总是1。4.LENGTH运算符运算符K1 DB 10H DUP(0)K2 DB 10H,20H,30H,40HK3 DW 20H DUP(0,1,2 DUP(0)K4 DB ABCDEFGH.MOV AL,LENGTH K1 ;(AL)=10HMOV BL,LENGTH K2 ;(BL)=1MOV CX,LENGTH K3 ;(CX)=20HMOV DX,LENGTH K4
13、 ;(DX)=174该运算符只能作用于变量,该运算符只能作用于变量,SIZE取值等于取值等于LENGTH和和TYPE两个运算符返回值的乘积。两个运算符返回值的乘积。5.SIZE运算符运算符例如,对于刚才的例子,加上以下指令:例如,对于刚才的例子,加上以下指令:K1 DB 10H DUP(0)K2 DB 10H,20H,30H,40HK3 DW 20H DUP(0,1,2 DUP(0)K4 DB ABCDEFGH.MOV AL,SIZE K1 ;(AL)=10HMOV BL,SIZE K2 ;(BL)=1MOV CL,SIZE K3 ;(CL)=20H*2=40HMOV DL,SIZE K4 ;
14、(DL)=175五、属性修改运算符五、属性修改运算符 这一类运算符用来对变量、标号或存储器操作数的类这一类运算符用来对变量、标号或存储器操作数的类型属性进行修改或指定。型属性进行修改或指定。1.PTR运算符运算符类型类型 PTR 地址表达式地址表达式使用格式:使用格式:作用作用:将地址表达式所指定的标号、变量或用其它形式表将地址表达式所指定的标号、变量或用其它形式表示的存储器地址的类型属性修改为示的存储器地址的类型属性修改为“类型类型”所指的值。所指的值。类型可以是类型可以是BYTE、WORD、DWORD、NEAR和和FAR。这种修改是临时性的,只在含有该运算符的语句内有效。这种修改是临时性的
15、,只在含有该运算符的语句内有效。76DA_BYTE DB 20H DUP(0)DA_WORD DW 30H DUP(0).MOV AX,WORD PTR DA_BYTE10ADD BYTE PTR DA_WORD20,BLINC BYTE PTR BX SUB WORD PTR SI,100JMP FAR PTR SUB1 ;指明指明SUB1不是本段中的地址不是本段中的地址772.HIGH/LOW运算符运算符HIGH 表达式表达式 LOW 表达式表达式使用格式:使用格式:这两个运算符用来将一个数据分离出高字节和低字节。这两个运算符用来将一个数据分离出高字节和低字节。如果表达式为一个常量,则将其
16、分离成高如果表达式为一个常量,则将其分离成高8位和低位和低8位;位;如果表达式是一个地址(段基值或偏移量)时,则分离如果表达式是一个地址(段基值或偏移量)时,则分离出它的高字节和低字节。出它的高字节和低字节。78例如:例如:DATA SEGMENT CONST EQU 0ABCDH DA1 DB 10H DUP(0)DA2 DW 20H DUP(0)DATA ENDS .MOV AH,HIGH CONSTMOV AL,LOW CONSTMOV BH,HIGH (OFFSET DA1)MOV BL,LOW (OFFSET DA2)MOV CH,HIGH(SEG DA1)MOV CL,LOW (S
17、EG DA2)设设DATA段的段基值是段的段基值是0926H,则上述指令序列,则上述指令序列汇编后的等效指令为汇编后的等效指令为:MOV AH,0ABHMOV AL,0CDHMOV BH,00HMOV BL,10HMOV CH,09HMOV CL,26H79注意:注意:HIGH/LOW运算符不能用来分离一个变量、寄运算符不能用来分离一个变量、寄存器或存储器单元的高字节与低字节。存器或存储器单元的高字节与低字节。下面语句使用是错误的用法。下面语句使用是错误的用法。DA1 DW 1234HMOV AH,HIGH DA1MOV BH,LOW AXMOV CH,HIGH SI803.THIS运算符运算
18、符THIS运算符一般与等值运算符运算符一般与等值运算符EQU连用,用来定义一连用,用来定义一个变量或标号的类型属性。个变量或标号的类型属性。所定义的变量或标号的段基所定义的变量或标号的段基值和偏移量与紧跟其后的变量或标号相同。值和偏移量与紧跟其后的变量或标号相同。例如:例如:DATA_BYTE EQU THIS BYTEDATA_WORD DW 10 DUP(0)MOV AX,DATA_WORD MOV BL,DATA_BYTE .81又如:又如:LFAR EQU THIS FARLNEAR:MOV AX,B标号标号LFAR与与LNEAR具有相同的逻辑地址值,但类型不具有相同的逻辑地址值,但类
19、型不同。同。LNEAR只能被本段中的指令调用,而只能被本段中的指令调用,而LFAR可以被可以被其它段的指令调用。其它段的指令调用。82六、运算符的优先级六、运算符的优先级在一个表达式中如果存在多个运算符时,在计算时就有先在一个表达式中如果存在多个运算符时,在计算时就有先后顺序问题。不同的运算符具有不同的运算优先级别。后顺序问题。不同的运算符具有不同的运算优先级别。优先级别优先级别 运算符运算符(最高)(最高)1 LENGTH,SIZE,圆括号,圆括号 2 PTR,OFFSET,SEG,TYPE,THIS 3 HIGH,LOW 4 *,/,MOD,SHR,SHL 5 +,-6 EQ,NE,LT,
20、LE,GT,GE 7 NOT 8 AND(最低)(最低)9 OR,XOR 10 SHORT83汇编程序在计算表达式时,按以下规则进行运算。汇编程序在计算表达式时,按以下规则进行运算。先执行优先级别高的运算,再算较低级别运算;先执行优先级别高的运算,再算较低级别运算;相同优先级别的操作,按照在表达式中的顺序,从相同优先级别的操作,按照在表达式中的顺序,从左到右进行;左到右进行;可以用圆括号改变运算的顺序可以用圆括号改变运算的顺序。例如:例如:K1=10 OR 5 AND 1 ;结果为;结果为K1=11K2=(10 OR 5)AND 1 ;结果为;结果为K2=184 在源程序设计中,使用符号定义语
21、句将一些常数或表在源程序设计中,使用符号定义语句将一些常数或表达式等内容用某个指定的符号来表示。在达式等内容用某个指定的符号来表示。在8086/8088汇编语汇编语言中有两种符号定义语句。言中有两种符号定义语句。4.4 符号定义语句符号定义语句一、等值语句一、等值语句语句格式:符号名语句格式:符号名 EQU 表达式表达式功能:功能:用符合名来表示用符合名来表示EQU右边的表达式。后面的程序中右边的表达式。后面的程序中一旦出现该符合名,汇编程序将把它替换成该表达式。一旦出现该符合名,汇编程序将把它替换成该表达式。一般来说,表达式可以是任何形式,常有以下几种情况。一般来说,表达式可以是任何形式,常
22、有以下几种情况。851.常数或数值表达式常数或数值表达式COUNT EQU 5NUM EQU COUNT+5ALPHA EQU 9BETA EQU ALPHA+18BB EQU BP+8862.地址表达式地址表达式ADR1被定义为在被定义为在DS数据段中以数据段中以BP作基作基址寻址的一个存储单元。址寻址的一个存储单元。ADR1 EQU DS:BP+14873.变量、寄存器名或指令助记符变量、寄存器名或指令助记符例如:例如:CREG EQU CX ;在后面的程序使用;在后面的程序使用CREG就是使用就是使用CX CBD EQU DAA ;DAA为十进制调整指令。为十进制调整指令。注意:在同一源
23、程序中,同一符号不能用注意:在同一源程序中,同一符号不能用EQU定义多次。定义多次。例:例:CBD EQU DAA CBD EQU ADD错误使用错误使用88格式:符号名格式:符号名=表达式表达式二、等号语句二、等号语句等号语句与等值语句具有相同的作用。等号语句与等值语句具有相同的作用。但等号语句可但等号语句可以对一个符号进行多次定义。以对一个符号进行多次定义。例如:例如:CONT=5NUM=14HNUM=NUM+10HCBD=DAACBD=ADD注意:注意:等值语句与等号等值语句与等号语句都不会为符号分配语句都不会为符号分配存储单元。因此所定义存储单元。因此所定义的符号没有段、偏移量的符号没
24、有段、偏移量和类型等属性。和类型等属性。注意:注意:EQU语句不能重复定义,而语句不能重复定义,而“=”伪指令可以重伪指令可以重复定义,其作用域从定义点到重新定义之前。复定义,其作用域从定义点到重新定义之前。89三、地址计数器三、地址计数器$地址计数器地址计数器$:表示当前的偏移地址值。:表示当前的偏移地址值。例:如果用在数据段的存储单元定义中,例:如果用在数据段的存储单元定义中,可写成:可写成:ABC DW 1,2,$+3,4 实际存储显示:实际存储显示:04H 01H02H00H07H00HABC12$+3400H00H90例:如果用在转移指令中:例:如果用在转移指令中:JMP$+5则无条
25、件跳转到当前指令的偏移地址则无条件跳转到当前指令的偏移地址+5单元继续执行。单元继续执行。例:如果用在数据段的存储单元定义中,例:如果用在数据段的存储单元定义中,ARRAY DW 1,2,$+10 实际存储显示:实际存储显示:01H02H00H0EH00HABC12$+1000H91四、置汇编计数器语句四、置汇编计数器语句ORG格式:格式:ORG 数值表达式数值表达式功能:将数值表达式的值赋给汇编地址计数器。功能:将数值表达式的值赋给汇编地址计数器。数值表达式的值须为数值表达式的值须为065545之间的非负整数。之间的非负整数。例例:给汇编地址计数器赋值。给汇编地址计数器赋值。DATA SEG
26、MENT ORG10;置值为置值为10 VAR1DW 100H,200H ORG+5 ;置的值为置的值为14+5,即为,即为19 VAR2DB 1,2,+1,+2 N EQU-VAR2 ;()()=24DATA ENDS92例:如果用在数据段中,该指令可以确定存储单元的偏例:如果用在数据段中,该指令可以确定存储单元的偏移地址,例如将移地址,例如将X单元的偏移地址定义为单元的偏移地址定义为0020H,该单元,该单元的内容为的内容为5,即,即(DS:0020H)=5。伪指令如下:。伪指令如下:DATA SEGMENT ORG 0020H X DW 5 DATA ENDS934.5、程序的段结构、程
27、序的段结构 8086/8088在管理内存时,需要按照逻辑段进行划在管理内存时,需要按照逻辑段进行划分,不同的逻辑段可以用来存放不同目的的数据。在分,不同的逻辑段可以用来存放不同目的的数据。在程序中使用程序中使用四个段寄存器四个段寄存器CS,DS,ES和和SS来访问它们来访问它们。在源程序设计时,在源程序设计时,使用伪指令来定义和使用这些逻辑段。使用伪指令来定义和使用这些逻辑段。94段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 .本段语句序列本段语句序列 .段名段名 ENDS一般格式:一般格式:一、段定义伪指令一、段定义伪指令 伪指令伪指令SEGMENT和和ENDS
28、用于定义一个逻辑段用于定义一个逻辑段。使。使用时必须配对,分别表示定义的开始与结束。用时必须配对,分别表示定义的开始与结束。95 段名是由用户自己任意选定的,符合标识符定义规段名是由用户自己任意选定的,符合标识符定义规则的一个名称。则的一个名称。段定义伪指令语句各部分的作用如下:段定义伪指令语句各部分的作用如下:1、段名、段名 最好选用与该逻辑段用途相关的名称。如第一个数据最好选用与该逻辑段用途相关的名称。如第一个数据段为段为DATA1,第二个数据为第二个数据为DATA2等。等。一个段的开始与结尾用的段名必须一致。一个段的开始与结尾用的段名必须一致。962、定位类型、定位类型 定位类型用于决定
29、段的起始边界,即第一个可存放数据定位类型用于决定段的起始边界,即第一个可存放数据的位置(不是段基址)。它可以有的位置(不是段基址)。它可以有4种取值。种取值。由于一个页面为由于一个页面为256个字节,并且页面编号从个字节,并且页面编号从0开始,因开始,因此,此,PAGE定位类型的段起始地址的最后定位类型的段起始地址的最后8位二进制数一定位二进制数一定为为0,即以,即以00H结尾的地址。结尾的地址。(1)PAGE:表示该段从一个页面的边界开始表示该段从一个页面的边界开始(2)PARA:表示该段从一个小节的边界开始表示该段从一个小节的边界开始如果用户未选定位类型,则缺省为如果用户未选定位类型,则缺
30、省为PARA。97(3)WORD:表示该段从一个偶数字节地址开始,即段起表示该段从一个偶数字节地址开始,即段起始单元地址的最后一位二进制数一定是始单元地址的最后一位二进制数一定是0。(4)BYTE:表示该段起始单元地址可以是任一地址值。表示该段起始单元地址可以是任一地址值。注意:注意:定位类型为定位类型为PAGE和和PARA时,段起始地址与段基址时,段起始地址与段基址相同。定位类型为相同。定位类型为WORD和和BYTE时,段起始地址与段基址时,段起始地址与段基址可能不同。可能不同。98(1)NONE:若未指定组合类型,表示本段与其它段无连接若未指定组合类型,表示本段与其它段无连接关系。在装入内
31、存时,本段有自己的物理段,因此有自己的关系。在装入内存时,本段有自己的物理段,因此有自己的段基址。段基址。3、组合类型、组合类型 组合类型说明符用来指定段与段之间的连接关系和定位。组合类型说明符用来指定段与段之间的连接关系和定位。它有六种取值选择。它有六种取值选择。(2)PUBLIC:在满足定位类型的前提下,将与该段同名的段在满足定位类型的前提下,将与该段同名的段邻接在一起,形成一个新的逻辑段,共用一个段基址。段内邻接在一起,形成一个新的逻辑段,共用一个段基址。段内的所有偏移量调整为相对于新逻辑段的段基址。的所有偏移量调整为相对于新逻辑段的段基址。99(3)COMMON:产生一个覆盖段。在多个
32、模块连接时,把产生一个覆盖段。在多个模块连接时,把该段与其它也用该段与其它也用COMMON说明的同名段置成相同的段基址,说明的同名段置成相同的段基址,这样就达到了共享同一存储区。共享存储区的长度由同名段这样就达到了共享同一存储区。共享存储区的长度由同名段中最大的段确定。中最大的段确定。(4)STACK:把所有同名段连接成一个连续段,且系统自动把所有同名段连接成一个连续段,且系统自动对对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指段寄存器初始化为该连续段的段基址。并初始化堆栈指针针SP。用户程序中应至少有一个段用用户程序中应至少有一个段用STACK说明,否则需要用说明,否则需要用户程序自
33、己初始化户程序自己初始化SS和和SP。100(5)AT表达式表达式:表示本段可定位在表达式所指示的小节边界表示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。上。表达式的值也就是段基值。(6)MEMORY:表示本段在存储器中应定位在所有其它段这表示本段在存储器中应定位在所有其它段这之后的最高地址上。如果有多个用之后的最高地址上。如果有多个用MEMORY说明的段,则只说明的段,则只处理第一个用处理第一个用MEMORY说明的段。其余的被视为说明的段。其余的被视为COMMON.101 类别名为某一个段或几个相同类型段设定的类型名称。类别名为某一个段或几个相同类型段设定的类型名称。系统在
34、进行连接处理时,把类别名相同的段存放在相邻的存系统在进行连接处理时,把类别名相同的段存放在相邻的存储区,但段的划分与使用仍按原来的设定。储区,但段的划分与使用仍按原来的设定。4.类别名类别名 类别名必须用单引号引起来。所用字符串可任意选定,类别名必须用单引号引起来。所用字符串可任意选定,但它不能使用程序中的标号、变量名或其它定义的符号。但它不能使用程序中的标号、变量名或其它定义的符号。在定义一个段时,段名是必须有的项,而定位类型、组在定义一个段时,段名是必须有的项,而定位类型、组合类型和类别名三个参数是可选项。各个参数之间用空格分合类型和类别名三个参数是可选项。各个参数之间用空格分隔。各参数之
35、间的顺序不能改变。隔。各参数之间的顺序不能改变。下面是一个分段结构的源程序框架。下面是一个分段结构的源程序框架。102STACK1 SEGMENT PARA STACK STACK0 .STACK1 ENDSDATA1 SEGMENT PARA DATA .DATA1 ENDSSTACK2 SEGMENT PARA STACK0 .STACK2 ENDSCODE SEGMENT PARA MEMORY ASSUME CS:CODE,DS:DATA1,SS:STACK1MAIN:.CODE ENDS END MAINDATA2 SEGMENT BYTE DATA .DATA2 ENDS 103
36、二、段寻址伪指令二、段寻址伪指令 段寻址伪指令段寻址伪指令ASSUME的作用的作用是是告诉汇编程序告诉汇编程序,在处理在处理源程序时,定义的段与哪个寄存器关联源程序时,定义的段与哪个寄存器关联。ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,.一般格式一般格式:其中段寄存器名为其中段寄存器名为CS,DS,ES和和SS四个之一,段名是用四个之一,段名是用SEGMENT/ENDS伪指令定义的段名。伪指令定义的段名。ASSUME并不设置各个段寄存器的具体内容,段寄存器并不设置各个段寄存器的具体内容,段寄存器的值是在程序运行时设定的。的值是在程序运行时设定的。10
37、4DATA1 SEGMENTVAR1 DB 12HDATA1 ENDSDATA2 SEGMENT VAR2 DB 34H DATA2 ENDS CODE SEGMENT VAR3 DB 56H ASSUME CS:CODE,DS:DATA1,ES:DATA2START:.INC VAR1 INC VAR2 INC VAR3 .CODE ENDS END START该指令汇编时,该指令汇编时,VAR1使用的是使用的是DS该指令被汇编时,该指令被汇编时,VAR2使用的是使用的是ES,即即指令编码中有段前缀指令编码中有段前缀105在一个代码段中可以有几条在一个代码段中可以有几条ASSUME伪指令,对
38、于前面的设伪指令,对于前面的设置,可以用置,可以用ASSUME改变原来的设置。改变原来的设置。一条一条ASSUME语句不一定设置全部段寄存器,可以选择其中语句不一定设置全部段寄存器,可以选择其中一个或几个段寄存器。一个或几个段寄存器。可以使用关键字可以使用关键字NOTHING将前面的设置删除。将前面的设置删除。ASSUME ES:NOTHING;删除前面对删除前面对ES与某个定义段的关联与某个定义段的关联ASSUME NOTHING ;删除全部删除全部4个段寄存器的设置个段寄存器的设置106三、段寄存器的装入三、段寄存器的装入 段寄存器的初值(段基值)装入需要用程序的方段寄存器的初值(段基值)
39、装入需要用程序的方法来实现。四个段寄存器的装入方法略有不同。法来实现。四个段寄存器的装入方法略有不同。在程序中,使用数据传送语句来实现对在程序中,使用数据传送语句来实现对DS和和ES的装入。的装入。1、DS和和ES的装入的装入107DATA1 SEGMENTDBYTE1 DB 12HDATA1 ENDSDATA2 SEGMENTDBYTE2 DB 14H DUP(?)DATA2 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AL,DBYTE1 MOV
40、 DBYTE22,AL .CODE ENDS该指令在汇编时出错,该指令在汇编时出错,因为在因为在ASSUME指令指令中未指定中未指定ES与与DATA2的联系。的联系。为了改正上述程序中的错误,可以为了改正上述程序中的错误,可以在变量在变量DBYTE2前加一个段前缀说前加一个段前缀说明即可。即:明即可。即:MOV ES:DBYTE22,AL108SS的装入有两种方法的装入有两种方法2、SS的装入的装入(1)在段定义伪指令的组合类型项中,使用)在段定义伪指令的组合类型项中,使用STACK参数,参数,并在段寻址伪指令并在段寻址伪指令ASSUME语句中把该段与语句中把该段与SS段寄存器段寄存器关联。关
41、联。STACK1 SEGMENT PARA STACK DB 40H DUP(?)STACK1 ENDS .CODE SEGMENT ASSUME CS:CODE,SS:STACK1 .SS将被自动装入将被自动装入STACK1段的段基值,堆栈指针段的段基值,堆栈指针SP也将指也将指向堆栈底部向堆栈底部+2的存储单元。上例中(的存储单元。上例中(SP)=40H。109(2)如果在段定义伪指令的组合类型中,未使用)如果在段定义伪指令的组合类型中,未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时,可以参数,或者是在程序中要调换到另一个堆栈,这时,可以使用类似于使用类似于DS和和ES的装入
42、方法。的装入方法。DATA_STACK SEGMENT DB 40H DUP(?)TOP LABEL WORDDATA_STACK ENDS .CODE SEGMENT .MOV AX,DATA_STACK MOV SS,AX MOV SP,OFFSET TOP .TOP变量的变量的偏移量为偏移量为40H110 CS保存的是当前目标代码的段基值,而保存的是当前目标代码的段基值,而IP提供下一条将提供下一条将要执行的目标代码的偏移量。要执行的目标代码的偏移量。CPU在执行指令之前根据在执行指令之前根据CS和和IP的内容来从内存中提取指令。因此,必须在程序执行之前的内容来从内存中提取指令。因此,必
43、须在程序执行之前装入装入CS和和IP的值。由于这时程序还没有运行,就无法用几条的值。由于这时程序还没有运行,就无法用几条可执行语句来装入可执行语句来装入CS和和IP。3、CS的装入的装入 END 起始地址起始地址装入装入CS和和IP一般有下面两种情况。一般有下面两种情况。(1)按照结束伪指令指定的地址装入按照结束伪指令指定的地址装入CS和和IP任何一个源程序都必须以任何一个源程序都必须以END伪指令来结束。伪指令来结束。其格式为:其格式为:111 END伪指令的作用是标识源程序结束和指定程序运伪指令的作用是标识源程序结束和指定程序运行时的起始地址。当程序被装入内存时,根据起始地址行时的起始地址
44、。当程序被装入内存时,根据起始地址的段基值和偏移量分别自动装入的段基值和偏移量分别自动装入CS和和IP中。中。.CODE SEGMENT ASSUME CS:CODE,.START:.CODE ENDS END START 起始地址可以是一个标号或表达式,它与程序中第起始地址可以是一个标号或表达式,它与程序中第一条指令语句前所加的标号必须一致。一条指令语句前所加的标号必须一致。112(2)在程序运行期间,当执行某些指令时,在程序运行期间,当执行某些指令时,CPU自动自动修改修改CS和和IP,使它们指向新的代码段。,使它们指向新的代码段。执行段间过程调用执行段间过程调用CALL和段间返回指令和段
45、间返回指令RET;执行段间无条件转移指令执行段间无条件转移指令JMP;响应中断及中断返回指令;响应中断及中断返回指令;执行硬件复位操作。执行硬件复位操作。113 在程序设计过程中,常常将具有一定功能的程序段设计成一在程序设计过程中,常常将具有一定功能的程序段设计成一个子程序。在个子程序。在MASM宏汇编程序中,用过程宏汇编程序中,用过程(PROCEDURE)来构来构造子程序。造子程序。4.6 过程定义伪指令(过程定义伪指令(PROC/ENDP)过程名过程名 PROC NEAR/FAR .RET .过程名过程名 ENDP过程定义伪指令格式如下:过程定义伪指令格式如下:114其中,过程名是该子程序
46、的名称,它被用作过程调用指令其中,过程名是该子程序的名称,它被用作过程调用指令CALL的目的操作数。它类同一个标号的作用。具有段、偏的目的操作数。它类同一个标号的作用。具有段、偏移量和距离三个属性。而距离属性使用移量和距离三个属性。而距离属性使用NEAR和和FAR来指定,来指定,若没有指定,则隐含为若没有指定,则隐含为NEAR。NEAR过程只能被本段指令调用,而过程只能被本段指令调用,而FAR过程可以供其它段过程可以供其它段的指令调用。的指令调用。每一个过程中必须包含有返回指令每一个过程中必须包含有返回指令RET,其作用是控制其作用是控制CPU从从子程序中返回到调用该过程的主程序。子程序中返回
47、到调用该过程的主程序。115一、使用程序段前缀一、使用程序段前缀PSP(Program Segment Prefix)实现返回实现返回4.7 从程序返回操作系统的方法从程序返回操作系统的方法 为了使程序运行结束后,能够正确地返回到操作系统,为了使程序运行结束后,能够正确地返回到操作系统,需要在用户程序中加上一些必要的语句。一般有以下两种需要在用户程序中加上一些必要的语句。一般有以下两种方法。方法。DOS系统将一个系统将一个.EXE(可执行文件)装入内存时,在(可执行文件)装入内存时,在该文件的前面生成一个程序段前缀该文件的前面生成一个程序段前缀PSP,其长度为,其长度为100H字字节。同时让节
48、。同时让DS和和ES都指向都指向PSP的开始,而的开始,而CS指向该程序指向该程序的代码段,即第一条可执行指令。的代码段,即第一条可执行指令。116为了使程序执行完后,正确返回为了使程序执行完后,正确返回DOS,需要做以下三个工作:,需要做以下三个工作:1.将用户程序编制成一个过程,类型为将用户程序编制成一个过程,类型为FAR;2.将将PSP的起始逻辑地址压栈,即将的起始逻辑地址压栈,即将INT 20H指令的地址压栈指令的地址压栈;如图所示。如图所示。PSP中一开始就中一开始就是一条中断指令是一条中断指令 INT 20H,执行该指令将终止用户程序,执行该指令将终止用户程序,返回返回DOS系统。
49、系统。1173.在用户程序结束时在用户程序结束时,使用使用RET指令。执行该指令将使保存指令。执行该指令将使保存在堆栈中的在堆栈中的INT 20H 的逻辑地址弹出到的逻辑地址弹出到CS和和IP中。中。DATA SEGMENT DATA ENDSSTACK1 SEGMENT STACK STACK1 ENDSCODE SEGMENTBEGIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1START:PUSH DS MOV AX,0 PUSH AX118 MOV AX,DATA MOV DS,AX RETBEGIN ENDPCODE ENDS END STAR
50、T 二、使用二、使用DOS系统功能调用实现返回系统功能调用实现返回 执行执行DOS功能调用功能调用4CH,也可以控制用户程序结束,也可以控制用户程序结束,并返回并返回DOS操作系统。操作系统。MOV AH,4CH INT 21H具体方法是在程序结束时,使用两条指令:具体方法是在程序结束时,使用两条指令:119CODE SEGMENT ASSUME CS:CODE.BEGIN:MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21HCODE ENDS END BEGIN二、使用二、使用DOS系统功能调用实现返回系统功能调用实现返回 执行执行DOS功能调用功能调用4CH,也