汇编语言设计实践:第4部分 基本汇编语言

上传人:努力****83 文档编号:190495411 上传时间:2023-02-28 格式:PPT 页数:104 大小:800KB
返回 下载 相关 举报
汇编语言设计实践:第4部分 基本汇编语言_第1页
第1页 / 共104页
汇编语言设计实践:第4部分 基本汇编语言_第2页
第2页 / 共104页
汇编语言设计实践:第4部分 基本汇编语言_第3页
第3页 / 共104页
点击查看更多>>
资源描述
汇编语言的程序格式汇编语言的程序格式 所有的指令语句必须位于某一个代码段内,伪指令所有的指令语句必须位于某一个代码段内,伪指令 语句可根据需要位于任一段内或段外语句可根据需要位于任一段内或段外 完整的汇编语言源程序由段组成,段由指令语句完整的汇编语言源程序由段组成,段由指令语句与伪指令语句构成与伪指令语句构成 一个汇编语言源程序可以包含若干个代码段、数一个汇编语言源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可随据段、附加段或堆栈段,段与段之间的顺序可随意排列意排列 需独立运行的程序必须包含一个代码段,并指示需独立运行的程序必须包含一个代码段,并指示程序执行的起始点,一个程序只有一个起始点程序执行的起始点,一个程序只有一个起始点4.1 汇编语言语句种类及其格式汇编语言语句种类及其格式第四章第四章 基本汇编语言基本汇编语言2 汇编语言的语句可以分为指令语句和伪指令语句汇编语言的语句可以分为指令语句和伪指令语句指令语句指令语句产生使产生使CPU产生动作、可供机器产生动作、可供机器执行的机器目标代码执行的机器目标代码伪指令语句伪指令语句不产生不产生CPU动作、在程序执行动作、在程序执行前由汇编程序处理的说明性语句,例如,数据说明、前由汇编程序处理的说明性语句,例如,数据说明、变量定义等等变量定义等等3 每一条指令语句在汇编时都要产生一个可供每一条指令语句在汇编时都要产生一个可供CPU执执行的机器目标代码,它又叫可执行语句。行的机器目标代码,它又叫可执行语句。一、指令语句一、指令语句指令语句的一般格式为:指令语句的一般格式为:标号标号操作码操作码操作数操作数注释注释;:,一条指令语句最多可以包含一条指令语句最多可以包含4个字段个字段例例 L1:MOV AH,0A0H ;将将0A0H放入放入AH4标号是标号是可选字段可选字段,它后面必须有,它后面必须有“:”。标号是一条。标号是一条指令的符号地址,代表了该指令的第一个字节存放指令的符号地址,代表了该指令的第一个字节存放地址。地址。1.标号字段标号字段标号一般放在一个程序段或子程序的入口处,控制标号一般放在一个程序段或子程序的入口处,控制程序的执行转到该程序位置。程序的执行转到该程序位置。例例 ADDR1:MOV AL,100 JMP ADDR1在转移指令或子程序调用指令中,可直接引用这个在转移指令或子程序调用指令中,可直接引用这个标号标号(相当于是一个常数相当于是一个常数)。5该字段是一条指令的该字段是一条指令的必选项必选项,它表示这条语句要求,它表示这条语句要求CPU完成什么具体操作,如完成什么具体操作,如MOV、ADD、SHL等。等。2.操作码(指令助记符)字段操作码(指令助记符)字段有些指令还可以在指令助记符的前面加上前缀,实有些指令还可以在指令助记符的前面加上前缀,实现一定的附加操作。如串操作指令前所加的重复前现一定的附加操作。如串操作指令前所加的重复前缀缀REP等。等。6一条指令可以有一个操作数、两个操作数或者无操一条指令可以有一个操作数、两个操作数或者无操作数。作数。3.操作数字段操作数字段如如ADD、MOV指令需要两个操作数,指令需要两个操作数,INC、NOT指令只需一个操作数,而指令只需一个操作数,而CLC指令不需要操作数。指令不需要操作数。74.注释字段注释字段例:例:LABEL1:ADD AX,BX;功能为功能为AXMOV AX,0FF0FHMOV AL,NOT 0F0H =MOV AL,0FHMOV BL,55H AND 0F0H=MOV BL,50HMOV BH,55H OR 0F0H =MOV BH,0F5HMOV CL,55H XOR 0F0H=MOV CL,0A5H49三、关系运算符三、关系运算符关系运算符包括:关系运算符包括:EQ(等于)、(等于)、NE(不等于)、(不等于)、LT(小(小于)、于)、LE(小于等于)、(小于等于)、GT(大于)、(大于)、GE(大于等于)(大于等于)关系运算符用于比较两个表达式的大小。关系运算符关系运算符用于比较两个表达式的大小。关系运算符比较的两个表达式必须同为常数或同一逻辑段中的变量。比较的两个表达式必须同为常数或同一逻辑段中的变量。如果是常量的比较,则按无符号数进行比较;如果是如果是常量的比较,则按无符号数进行比较;如果是变量的比较,则比较它们的偏移量的大小。变量的比较,则比较它们的偏移量的大小。关系运算的结果只能是关系运算的结果只能是“真真”(全(全1)或)或“假假”(全(全0)50MOV AX,0FH EQ 1111B=MOV AX,0FFFFHMOV BX,0FH NE 1111B=MOV BX,0例例1:VAR DW NUM LT 0ABH该语句在汇编时,根据符号常量该语句在汇编时,根据符号常量NUM的大小来决定的大小来决定VAR存储单元的值,当存储单元的值,当NUM0ABH时,则变量时,则变量VAR的内容为的内容为0FFFFH,否则否则VAR的内容为的内容为0。例例251四、数值返回运算符四、数值返回运算符 该类运算符有该类运算符有5个,它们将变量或标号的某些特征值或存个,它们将变量或标号的某些特征值或存储单元地址的一部分提取出来。储单元地址的一部分提取出来。取变量或标号所在段的段基值。取变量或标号所在段的段基值。1.SEG运算符运算符DATA SEGMENT K1 DW 1,2 K2 DW 3,4 MOV AX,SEG K1MOV BX,SEG K2例如:例如:设设DATA逻辑段的段基值为逻辑段的段基值为1FFEH,则两条传送指令将被汇编为:则两条传送指令将被汇编为:MOV AX,1FFEHMOV BX,1FFEH作用作用52该运算符的作用是取变量或标号在段内的偏移量。该运算符的作用是取变量或标号在段内的偏移量。2.OFFSET运算符运算符例如:例如:DATA SEGMENT VAR1 DB 20H DUP(0)VAR2 DW 5A49H ADDR DW VAR2;将将VAR2的偏移量的偏移量20H存入存入ADDR中中DATA ENDS .MOV BX,VAR2 ;(BX)=5A49H MOV SI,0FFSET VAR2 ;(SI)=20H MOV DI,ADDR ;(DI)=20H MOV BP,OFFSET ADDR ;(BP)=22H53该运算符的作用为取变量或标号的类型属性,并用数字形式该运算符的作用为取变量或标号的类型属性,并用数字形式来表示。对变量来说就是取它的字节长度。来表示。对变量来说就是取它的字节长度。3.TYPE运算符运算符变量变量BYTE 1WORD 2DWORD 4标号标号NEAR -1FAR -254例如:例如:V1 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,04H55 该运算符只能加在变量的前面。如果变量是用重复数该运算符只能加在变量的前面。如果变量是用重复数据操作符据操作符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;(DX)=156 该运算符只能作用于变量,该运算符只能作用于变量,SIZE取值等于取值等于LENGTH和和TYPE两个运算符返回值的乘积。两个运算符返回值的乘积。5.SIZE运算符运算符例如,对于上面例子,加上以下指令:例如,对于上面例子,加上以下指令:MOV AL,SIZE K1;(AL)=10HMOV BL,SIZE K2;(BL)=1MOV CL,SIZE K3;(CL)=20H*2=40HMOV DL,SIZE K4;(DL)=1K1 DB 10H DUP(0)K2 DB 10H,20H,30H,40HK3 DW 20H DUP(0,1,2 DUP(0)K4 DB ABCDEFGH.57五、属性修改运算符五、属性修改运算符 这一类运算符用来对变量、标号或存储器操作数的类这一类运算符用来对变量、标号或存储器操作数的类型属性进行修改或指定。型属性进行修改或指定。1.PTR运算符运算符类型类型 PTR 地址表达式地址表达式使用格式:使用格式:作用作用:将地址表达式所指定的标号、变量或用其它形式表将地址表达式所指定的标号、变量或用其它形式表示的存储器地址的类型属性修改为示的存储器地址的类型属性修改为“类型类型”所指的值。所指的值。类型可以是类型可以是BYTE、WORD、DWORD、NEAR和和FAR。这种修改是临时性的,只在含有该运算符的语句内有效。这种修改是临时性的,只在含有该运算符的语句内有效。58例如:例如:DA_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不是本段中的地址不是本段中的地址592.HIGH/LOW运算符运算符HIGH 表达式表达式 LOW 表达式表达式使用格式:使用格式:这两个运算符用来将一个数据分离出高字节和低字节。这两个运算符用来将一个数据分离出高字节和低字节。如果表达式为一个常量,则将其分离成高如果表达式为一个常量,则将其分离成高8位和低位和低8位;位;如果表达式是一个地址(段基值或偏移量)时,则分如果表达式是一个地址(段基值或偏移量)时,则分离出它的高字节和低字节。离出它的高字节和低字节。60例如:例如:DATA SEGMENTCONST EQU 0ABCDHDA1 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 (SEG DA2)设设DATA段的段基值是段的段基值是0926H,则上,则上述指令序列汇编后的等效指令为述指令序列汇编后的等效指令为:MOV AH,0ABHMOV AL,0CDHMOV BH,00HMOV BL,10HMOV CH,09HMOV CL,26H61注意注意:HIGH/LOW运算符不能用来分离一个变量、寄运算符不能用来分离一个变量、寄存器或存储器单元的高字节与低字节。存器或存储器单元的高字节与低字节。下面语句使用是错误的用法。下面语句使用是错误的用法。DA1 DW 1234HMOV AH,HIGH DA1MOV BH,LOW AXMOV CH,HIGH SI623、THIS运算符运算符 THIS运算符一般与等值运算符运算符一般与等值运算符EQU连用,用来定连用,用来定义一个变量或标号的类型属性。所定义的变量或标号的义一个变量或标号的类型属性。所定义的变量或标号的段基值和偏移量与紧跟其后的变量或标号相同。段基值和偏移量与紧跟其后的变量或标号相同。例如:例如:DATA_BYTE EQU THIS BYTEDATA_WORD DW 10 DUP(0)MOV AX,DATA_WORD MOV BL,DATA_BYTE .又如:又如:LFAR EQU THIS FARLNEAR:MOV AX,B标号标号LFAR与与LNEAR具有相同的逻辑地址值,但类型具有相同的逻辑地址值,但类型不同。不同。LNEAR只能被本段中的指令调用,而只能被本段中的指令调用,而LFAR可可以被其它段的指令调用。以被其它段的指令调用。63六、运算符的优先级六、运算符的优先级在一个表达式中如果存在多个运算符时,在计算时就有先在一个表达式中如果存在多个运算符时,在计算时就有先后顺序问题。不同的运算符具有不同的运算优先级别。后顺序问题。不同的运算符具有不同的运算优先级别。优先级别优先级别 运算符运算符(最高)(最高)1 LENGTH,SIZE,圆括号,圆括号 2 PTR,OFFSET,SEG,TYPE,THIS 3 HIGH,LOW 4 *,/,MOD,SHR,SHL 5 +,-6 EQ,NE,LT,LE,GT,GE 7 NOT 8 AND(最低)(最低)9 OR,XOR64汇编程序在计算表达式时,按以下规则进行运算。汇编程序在计算表达式时,按以下规则进行运算。先执行优先级别高的运算,再算较低级别运算;先执行优先级别高的运算,再算较低级别运算;相同优先级别的操作,按照在表达式中的顺序,从相同优先级别的操作,按照在表达式中的顺序,从左到右进行;左到右进行;可以用圆括号改变运算的顺序可以用圆括号改变运算的顺序。例如:例如:K1=10 OR 5 AND 1 ;结果为;结果为K1=11K2=(10 OR 5)AND 1;结果为;结果为K2=1654.5 程序的段结构程序的段结构 8086/8088在管理内存时,需要按照逻辑段进行划在管理内存时,需要按照逻辑段进行划分,不同的逻辑段可以用来存放不同目的的数据。在分,不同的逻辑段可以用来存放不同目的的数据。在程序中使用四个段寄存器程序中使用四个段寄存器CS,DS,ES和和SS来访问它们。来访问它们。在源程序设计时,使用伪指令来定义和使用这些逻辑段。在源程序设计时,使用伪指令来定义和使用这些逻辑段。66段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 .本段语句序列本段语句序列 .段名段名 ENDS一般格式:一般格式:一、段定义伪指令一、段定义伪指令 伪指令伪指令SEGMENT和和ENDS用于定义一个逻辑段。使用于定义一个逻辑段。使用时必须配对,分别表示定义的开始与结束。用时必须配对,分别表示定义的开始与结束。67 段名是由用户自己任意选定的,符合标识符定义段名是由用户自己任意选定的,符合标识符定义规则的一个名称。规则的一个名称。段定义伪指令语句各部分的作用如下:段定义伪指令语句各部分的作用如下:1、段名、段名 最好选用与该逻辑段用途相关的名称。如第一个数最好选用与该逻辑段用途相关的名称。如第一个数据段为据段为DATA1,第二个数据为第二个数据为DATA2等。等。一个段的开始与结尾用的段名必须一致。一个段的开始与结尾用的段名必须一致。682、定位类型、定位类型 定位类型用于决定段的起始边界,即第一个可存放数据定位类型用于决定段的起始边界,即第一个可存放数据的位置(不是段基址)。它可以有的位置(不是段基址)。它可以有4种取值。种取值。(2)PARA:表示该段从一个小节的边界开始表示该段从一个小节的边界开始如果用户未选定位类型,则缺省为如果用户未选定位类型,则缺省为PARA。由于一个页面为由于一个页面为256个字节,并且页面编号从个字节,并且页面编号从0开始,因此,开始,因此,PAGE定位类型的段起始地址的最后定位类型的段起始地址的最后8位二进制数一定为位二进制数一定为0,即以即以00H结尾的地址。结尾的地址。(1)PAGE:表示该段从一个页面的边界开始表示该段从一个页面的边界开始69(3)WORD:表示该段从一个偶数字节地址开始,即段起始表示该段从一个偶数字节地址开始,即段起始单元地址的最后一位二进制数一定是单元地址的最后一位二进制数一定是0。(4)BYTE:表示该段起始单元地址可以是任一地址值。表示该段起始单元地址可以是任一地址值。注意注意:定位类型为:定位类型为PAGE和和PARA时,段起始地址与段基址时,段起始地址与段基址相同。定位类型为相同。定位类型为WORD和和BYTE时,段起始地址与段基址时,段起始地址与段基址可能不同。可能不同。70717273(1)若未指定组合类型,表示本段与其它段无连接关系。在)若未指定组合类型,表示本段与其它段无连接关系。在装入内存时,本段有自己的物理段,因此有自己的段基址。装入内存时,本段有自己的物理段,因此有自己的段基址。3、组合类型、组合类型 组合类型说明符用来指定段与段之间的连接关系和定位。组合类型说明符用来指定段与段之间的连接关系和定位。它有六种取值选择。它有六种取值选择。(2)PUBLIC:在满足定位类型的前提下,将与该段在满足定位类型的前提下,将与该段同名同名的的段邻接在一起,形成一个新的逻辑段,共用一个段基址。段段邻接在一起,形成一个新的逻辑段,共用一个段基址。段内的所有偏移量调整为相对于新逻辑段的段基址。内的所有偏移量调整为相对于新逻辑段的段基址。(3)COMMON:产生一个覆盖段。在多个模块连接时,把产生一个覆盖段。在多个模块连接时,把该段与其它也用该段与其它也用COMMON说明的说明的同名同名段置成相同的段基址,段置成相同的段基址,这样就达到了共享同一存储区。共享存储区的长度由同名段这样就达到了共享同一存储区。共享存储区的长度由同名段中最大的段确定。中最大的段确定。74(4)STACK:把所有把所有同名同名段连接成一个连续段,且系统自动段连接成一个连续段,且系统自动对对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指段寄存器初始化为该连续段的段基址。并初始化堆栈指针针SP。用户程序中一般应至少有一个段用用户程序中一般应至少有一个段用STACK说明,否则需说明,否则需要用户程序自己初始化要用户程序自己初始化SS和和SP。(5)AT表达式表达式:表示本段可定位在表达式所指示的小节边:表示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。界上。表达式的值也就是段基值。(6)MEMORY:表示本段在存储器中应定位在所有其它段这表示本段在存储器中应定位在所有其它段这之后的最高地址上。如果有多个用之后的最高地址上。如果有多个用MEMORY说明的段,则只说明的段,则只处理第一个用处理第一个用MEMORY说明的段。其余的被视为说明的段。其余的被视为COMMON.75 类别名为某一个段或几个相同类型段设定的类型名称。系类别名为某一个段或几个相同类型段设定的类型名称。系统在进行连接处理时,把类别名相同的段存放在相邻的存储统在进行连接处理时,把类别名相同的段存放在相邻的存储区,但段的划分与使用仍按原来的设定。区,但段的划分与使用仍按原来的设定。4.类别名类别名 类别名必须用单引号引起来。所用字符串可任意选定,类别名必须用单引号引起来。所用字符串可任意选定,但它不能使用程序中的标号、变量名或其它定义的符号。但它不能使用程序中的标号、变量名或其它定义的符号。在定义一个段时,段名是必须有的项,而定位类型、组在定义一个段时,段名是必须有的项,而定位类型、组合类型和类别名三个参数是可选项。各个参数之间用空格分合类型和类别名三个参数是可选项。各个参数之间用空格分隔。各参数之间的顺序不能改变。隔。各参数之间的顺序不能改变。76 二、段寻址伪指令二、段寻址伪指令 段寻址伪指令段寻址伪指令ASSUME的作用是告诉汇编程序的作用是告诉汇编程序,在处理源在处理源程序时,定义的段与哪个寄存器关联。程序时,定义的段与哪个寄存器关联。ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,.一般格式一般格式:其中段寄存器名为其中段寄存器名为CS,DS,ES和和SS四个之一,段名是用四个之一,段名是用SEGMENT/ENDS伪指令定义的段名。伪指令定义的段名。ASSUME并不设置各个段寄存器的具体内容,段寄存器并不设置各个段寄存器的具体内容,段寄存器的值是在程序运行时设定的。的值是在程序运行时设定的。ASSUME77ASSUME CS:CODE,DS:DATA1,ES:DATA2DATA1 SEGMENT VAR1 DB 12HDATA1 ENDSDATA2 SEGMENT VAR2 DB 34HDATA2 ENDSCODE SEGMENT VAR3 DB 56HSTART:.INC VAR1 INC VAR2 INC VAR3 .MOV AH,4CH INT 21HCODE ENDS END START分段结构的源程序框架分段结构的源程序框架78在一个代码段中可以有几条在一个代码段中可以有几条ASSUME伪指令,对于前面的伪指令,对于前面的设置,可以用设置,可以用ASSUME改变原来的设置。改变原来的设置。一条一条ASSUME语句不一定设置全部段寄存器,可以选择其中语句不一定设置全部段寄存器,可以选择其中一个或几个段寄存器。一个或几个段寄存器。可以使用关键字可以使用关键字NOTHING将前面的设置删除。将前面的设置删除。ASSUME ES:NOTHING;删除前面对删除前面对ES与某个定义段的关联与某个定义段的关联ASSUME NOTHING ;删除全部删除全部4个段寄存器的设置个段寄存器的设置例如:例如:79三、段寄存器的装入三、段寄存器的装入 段寄存器的初值(段基值)装入需要用程序的方法来实段寄存器的初值(段基值)装入需要用程序的方法来实现。四个段寄存器的装入方法略有不同。现。四个段寄存器的装入方法略有不同。在程序中,使用数据传送语句来实现对在程序中,使用数据传送语句来实现对DS和和ES的装入。的装入。1、DS和和ES的装入的装入80ASSUME CS:CODE,DS:DATA1DATA1 SEGMENT DBYTE1 DB 12HDATA1 ENDSDATA2 SEGMENT DBYTE2 DB 14H DUP(?)DATA2 ENDSCODE SEGMENT START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX MOV AL,DBYTE1 MOV DBYTE22,AL .CODE ENDS 例如:例如:81 为了改正上述程序中的错误,可以在变量为了改正上述程序中的错误,可以在变量DBYTE2前加一个段前缀说明即可。即:前加一个段前缀说明即可。即:MOV ES:DBYTE22,AL或者在前面增加或者在前面增加 ASSUME ES:DATA2 SS的装入有两种方法的装入有两种方法2、SS的装入的装入(1)在段定义伪指令的组合类型项中,使用)在段定义伪指令的组合类型项中,使用STACK参参数,并在段寻址伪指令数,并在段寻址伪指令ASSUME语句中把该段与语句中把该段与SS段寄段寄存器关联。存器关联。82STACK1 SEGMENT STACK DB 40H DUP(?)STACK1 ENDS .CODE SEGMENT ASSUME CS:CODE,SS:STACK1 .例如:例如:SS将被自动装入将被自动装入STACK1段的段基值,堆栈指针段的段基值,堆栈指针SP也也将指向堆栈底部将指向堆栈底部+2的存储单元。上例中(的存储单元。上例中(SP)=40H。(2)如果在段定义伪指令的组合类型中,未使用)如果在段定义伪指令的组合类型中,未使用STACK参数,或者是在程序中要调换到另一个堆栈,这时,可以参数,或者是在程序中要调换到另一个堆栈,这时,可以使用类似于使用类似于DS和和ES的装入方法。的装入方法。83DATA_STACK SEGMENT DB 40H DUP(?)TOP LABEL WORDDATA_STACK ENDS .CODE SEGMENT .MOV AX,DATA_STACK MOV SS,AX MOV SP,OFFSET TOP .例如:例如:TOP变量的偏移量为40H84 CS保存的是当前目标代码的段基值,而保存的是当前目标代码的段基值,而IP提供下一条将提供下一条将要执行的目标代码的偏移量。要执行的目标代码的偏移量。CPU在执行指令之前根据在执行指令之前根据CS和和IP的内容来从内存中提取指令。因此,必须在程序执行之前的内容来从内存中提取指令。因此,必须在程序执行之前装入装入CS和和IP的值。由于这时程序还没有运行,就无法用几条的值。由于这时程序还没有运行,就无法用几条可执行语句来装入可执行语句来装入CS和和IP。3、CS的装入的装入 END 起始地址起始地址装入装入CS和和IP一般有下面两种情况。一般有下面两种情况。(1)按照结束伪指令指定的地址装入按照结束伪指令指定的地址装入CS和和IP任何一个源程序都必须以任何一个源程序都必须以END伪指令来结束。伪指令来结束。起始地址可以是一个标号或表达式,它与程序中第一条起始地址可以是一个标号或表达式,它与程序中第一条被执行指令语句前所加的标号必须一致。被执行指令语句前所加的标号必须一致。其格式为:其格式为:85 END伪指令的作用是标识源程序结束和指定程序运行时伪指令的作用是标识源程序结束和指定程序运行时的起始地址。当程序被装入内存时,根据起始地址的段基值的起始地址。当程序被装入内存时,根据起始地址的段基值和偏移量分别自动装入和偏移量分别自动装入CS和和IP中。中。.CODE SEGMENT ASSUME CS:CODE,.START:.CODE ENDS END START例如:例如:程序执程序执行的起行的起始地址始地址86(2)在程序运行期间,当执行某些指令时,在程序运行期间,当执行某些指令时,CPU自动修改自动修改CS和和IP,使它们指向新的代码段。,使它们指向新的代码段。执行段间过程调用执行段间过程调用CALL和段间返回指令和段间返回指令RET;执行段间无条件转移指令执行段间无条件转移指令JMP;响应中断及中断返回指令;响应中断及中断返回指令;执行硬件复位操作。执行硬件复位操作。例如:例如:87 在程序设计过程中,常常将具有一定功能的程序段设计成一在程序设计过程中,常常将具有一定功能的程序段设计成一个子程序。在个子程序。在MASM宏汇编程序中,用过程宏汇编程序中,用过程(PROCEDURE)来构造子程序。来构造子程序。4.6 过程定义伪指令(过程定义伪指令(PROC/ENDP)过程名过程名 PROC NEAR/FAR .RET .过程名过程名 ENDP过程定义伪指令格式如下:过程定义伪指令格式如下:88其中,过程名是该子程序的名称,它被用作过程调用指令其中,过程名是该子程序的名称,它被用作过程调用指令CALL的目的操作数。它类同一个标号的作用。具有的目的操作数。它类同一个标号的作用。具有段、偏段、偏移量和距离移量和距离三个属性。而距离属性使用三个属性。而距离属性使用NEAR和和FAR来指定,来指定,若没有指定,则隐含为若没有指定,则隐含为NEAR。NEAR过程只能被本段指令调用,而过程只能被本段指令调用,而FAR过程可以供其它段过程可以供其它段的指令调用。的指令调用。每一个过程中必须包含有返回指令每一个过程中必须包含有返回指令RET,其作用是控制其作用是控制CPU从从子程序中返回到调用该过程的主程序。子程序中返回到调用该过程的主程序。89 4.7 当前位置计数器当前位置计数器$与定位伪指令与定位伪指令ORG(Origin)汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其设置一个位置计数器,它随时记录着定义的每一个数据或每设置一个位置计数器,它随时记录着定义的每一个数据或每一条指令在程序中的位置。一条指令在程序中的位置。在源程序中,使用符号在源程序中,使用符号$来表示位置计数器的当前值。因来表示位置计数器的当前值。因此,此,$被称为当前计数器。它位于不同的位置具有不同的值。被称为当前计数器。它位于不同的位置具有不同的值。位置计数器位置计数器$在使用上完全类似字变量的使用在使用上完全类似字变量的使用.90作用:将数值表达式的值赋给当前位置计数器。作用:将数值表达式的值赋给当前位置计数器。ORG语句语句为其后的数据或指令设置起始偏移量。为其后的数据或指令设置起始偏移量。表达式的值必须为正值。表达式中也可以包含有当前表达式的值必须为正值。表达式中也可以包含有当前位置计数器的现行值位置计数器的现行值$。定位伪指令定位伪指令ORG用来改变位置计数器的值。用来改变位置计数器的值。ORG 数值表达式数值表达式格式:格式:91DATA1 SEGMENT ORG 30H DB1 DB 12H,34H ORG$+20H STRING DB ABCDEFGHI COUT EQU$-STRING DB2 DW$DB3 DB$DATA1 ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA1 ORG 10H START:MOV AX,DATA MOV DS,AX .CODE ENDS END STARTORG保留了保留了30H个字节的空间个字节的空间DB1在在DATA1段内的偏移量为段内的偏移量为30H保留保留20H个字节单元,其后再存放个字节单元,其后再存放ABCD.计算计算STRING的长度的长度取取$的偏移量的偏移量,类似变量的用法类似变量的用法此语句错误此语句错误!整个段分配了整个段分配了5DH个字个字节节92DATA1 SEGMENT DB0 DB 12H,34H ORG$+20H DB1 DB 01H DATA1 ENDSDATA2 SEGMENT DB00 DB 12H,34H ORG 20H DB2 DB 01H NUM=10H DB3 DW$DB4 DW$+2 DATA2 ENDS ASSUME DS:DATA1,ES:DATA2 MOV AX,OFFSET DB1;(AX)=?MOV BX,OFFSET DB2;(BX)=?MOV CX,DB3;(CX)=?MOV DX,DB4;(DX)=?(AX)=22H(BX)=20H(CX)=21H(DX)=25H934.8 标题伪指令标题伪指令TITLETITLE 标题名标题名语句格式:语句格式:作用:给所在程序指定一个标题。以便在列表文件的每一页作用:给所在程序指定一个标题。以便在列表文件的每一页的第一行都显示这个标题。其中标题是用户任意选用的字符的第一行都显示这个标题。其中标题是用户任意选用的字符串,字符个数不能超过串,字符个数不能超过60。TITLE EXAMPLE1DATA SEGMENTDATA ENDSCODE SEGMENTBEGIN:CODE ENDS END BEGIN944.9 程序模块的连接程序模块的连接PUBLIC 符号符号1,符号符号2语句格式:语句格式:全局符号伪指令全局符号伪指令PUBLIC作用:符号作用:符号1必须是本模块中定必须是本模块中定义的义的变量名变量名,标号名标号名,常数常数,等值符号等值符号(用用EQU与与=定义的定义的符号符号)或者或者过程名过程名。本伪指令说明这些符号为全局符号。本伪指令说明这些符号为全局符号,可以可以在其他模块中直接引用在其他模块中直接引用.全局符号伪指令全局符号伪指令PUBLIC95EXTRN 符号符号1:类型类型,符号符号2:类型类型,语句格式:语句格式:外部符号伪指令外部符号伪指令EXTRN作用:该伪指令告诉汇编程序符号作用:该伪指令告诉汇编程序符号1,符号符号2不是本模块中定义的。而是其他模块定义的不是本模块中定义的。而是其他模块定义的,并且出并且出现在定义这些符号模块的现在定义这些符号模块的PUBLIC伪指令中伪指令中.也就是说也就是说,凡是凡是EXTRN语句中出现的符号一定在某模块的语句中出现的符号一定在某模块的PUBLIC语句中语句中说明。说明。外部符号伪指令外部符号伪指令EXTRNEXTRN语句中的类型不能够缺省。如果符号是变量,那么语句中的类型不能够缺省。如果符号是变量,那么类型为类型为BYTE,WORD,DWORD,结构名或记录名等。如,结构名或记录名等。如果符号为标号,类型名为果符号为标号,类型名为FAR或或NEAR,若符号为等值符号,若符号为等值符号,类型为类型为ABS。96 TITLE M1DATA SEGMENT STRING DB This is an example!$DATA ENDSSTACK1 SEGMENT STACK DW 20H DUP(?)STACK1 ENDSPUBLIC STRINGEXTRN DISPLAY:FAR CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX CALL DISPLAY MOV AH,4CH INT 21H CODE ENDS END START97 TITLE M2PUBLIC DISPLAYEXTRN STRING:BYTE CODE1 SEGMENT DISPLAY ROC FAR MOV DX,OFFSET STRING MOV AH,9 INT 21H RET DISPLAY ENDP CODE1 ENDS END984.10 从程序返回操作系统的方法从程序返回操作系统的方法1.从磁盘取从磁盘取.EXE文件文件2.构造构造256字节的程序段前缀字节的程序段前缀(PSP),PSP的第一个字单元为的第一个字单元为INT 20H 其功能为返回操作系统其功能为返回操作系统3.紧随紧随PSP,把程序装入存储器中,把程序装入存储器中操作系统装入程序的步骤操作系统装入程序的步骤99一、使用程序段前缀一、使用程序段前缀PSP(Program Segment Prefix)实现返回实现返回 为了使程序运行结束后,能够正确地返回到操作系统,为了使程序运行结束后,能够正确地返回到操作系统,需要在用户程序中加上一些必要的语句。一般有以下两种需要在用户程序中加上一些必要的语句。一般有以下两种方法。方法。二、使用二、使用DOS系统功能调用实现返回系统功能调用实现返回100如图所示。如图所示。PSP中一开始就中一开始就是一条中断指令是一条中断指令 INT 20H,执行该指令将终止用户程序,执行该指令将终止用户程序,返回返回DOS系统。系统。DOS系统将一个系统将一个.EXE(可执行文件)装入内存时,在(可执行文件)装入内存时,在该文件的前面生成一个程序段前缀该文件的前面生成一个程序段前缀PSP,其长度为,其长度为100H字节。字节。同时让同时让DS和和ES都指向都指向PSP的开始,而的开始,而CS指向该程序的代码指向该程序的代码段,即第一条可执行指令。段,即第一条可执行指令。一、使用程序段前缀一、使用程序段前缀PSP(Program Segment Prefix)实现返回实现返回101为了使程序执行完后,正确返回为了使程序执行完后,正确返回DOS,需要做以下三个工作:,需要做以下三个工作:1.将用户程序编制成一个过程将用户程序编制成一个过程,类型为类型为FAR;2.将将PSP的起始逻辑地址压栈的起始逻辑地址压栈,即将即将INT 20H指令的地址压栈指令的地址压栈;3.在用户程序结束时在用户程序结束时,使用使用RET指令。执行该指令将使保存指令。执行该指令将使保存在堆栈中的在堆栈中的INT 20H 的逻辑地址弹出到的逻辑地址弹出到CS和和IP中。中。102DATA SEGMENT DATA ENDSSTACK1 SEGMENT STACK STACK1 ENDSCODE SEGMENTMAIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1START:PUSH DS MOV AX,0 PUSH AX 程序结构如下:程序结构如下:MOV AX,DATA MOV DS,AX RETMAIN ENDPCODE ENDS END START 103二、使用二、使用DOS系统功能调用实现返回系统功能调用实现返回 执行执行DOS功能调用功能调用4CH,也可以控制用户程序结束,也可以控制用户程序结束,并返回并返回DOS操作系统。操作系统。MOV AH,4CH INT 21H具体方法是在程序结束时,使用两条指令:具体方法是在程序结束时,使用两条指令:104CODE SEGMENT ASSUME CS:CODE,SS:STACKSTART:MOV AX,DATA MOV DS,AX MOV AH,4CH INT 21HCODE ENDS END START用户程序的代码段的结构为:用户程序的代码段的结构为:DATA SEGMENT DATA ENDSSTACK1 SEGMENT PARA STACK STACK1 ENDS
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!