汇编语言语句种类及其格式ff

上传人:博****1 文档编号:580566884 上传时间:2024-08-29 格式:PPT 页数:85 大小:545KB
返回 下载 相关 举报
汇编语言语句种类及其格式ff_第1页
第1页 / 共85页
汇编语言语句种类及其格式ff_第2页
第2页 / 共85页
汇编语言语句种类及其格式ff_第3页
第3页 / 共85页
汇编语言语句种类及其格式ff_第4页
第4页 / 共85页
汇编语言语句种类及其格式ff_第5页
第5页 / 共85页
点击查看更多>>
资源描述

《汇编语言语句种类及其格式ff》由会员分享,可在线阅读,更多相关《汇编语言语句种类及其格式ff(85页珍藏版)》请在金锄头文库上搜索。

1、4.1 汇编语言语句种类及其格式汇编语言语句种类及其格式第四章第四章 汇编语言程序格式汇编语言程序格式 不同的汇编程序有不同的汇编语言编程规定。不同的汇编程序有不同的汇编语言编程规定。目前支持目前支持Intel8086/8088系列微机,常用的汇编程系列微机,常用的汇编程序有序有ASM、MASM、TASM、OPTASM等等 。 本章主要介绍汇编语言程序设计中的一些基本本章主要介绍汇编语言程序设计中的一些基本书写格式与语法规则。书写格式与语法规则。1 每一条指令语句在汇编时都要产生一个可供每一条指令语句在汇编时都要产生一个可供CPU执执行的机器目标代码,它又叫可执行语句。行的机器目标代码,它又叫

2、可执行语句。一、指令语句一、指令语句指令语句的一般格式为:指令语句的一般格式为:标号标号指令助记符指令助记符操作数操作数注释注释;:,一条指令语句最多可以包含一条指令语句最多可以包含4个字段个字段 汇编语言的语句可以分为指令语句、伪指令语句汇编语言的语句可以分为指令语句、伪指令语句和宏指令语句(宏调用语句)。和宏指令语句(宏调用语句)。2标号是可选字段,它后面必须有标号是可选字段,它后面必须有“:”。标号是一。标号是一条指令的符号地址,代表了该指令的第一个字节存条指令的符号地址,代表了该指令的第一个字节存放地址。放地址。1.标号字段标号字段标号一般放在一个程序段或子程序的入口处,控制标号一般放

3、在一个程序段或子程序的入口处,控制程序的执行转到该程序位置。程序的执行转到该程序位置。例例 ADDR1:MOV AL,100在转移指令或子程序调用指令中,可直接引用这个在转移指令或子程序调用指令中,可直接引用这个标号。标号。3该字段是一条指令的必选项,它表示这条语句要求该字段是一条指令的必选项,它表示这条语句要求CPU完成什么具体操作,如完成什么具体操作,如MOV、ADD、SHL等。等。2.指令助记符字段指令助记符字段一条指令可以有一个操作数、两个操作数或者无操一条指令可以有一个操作数、两个操作数或者无操作数。作数。3.操作数字段操作数字段有些指令还可以在指令助记符的前面加上前缀,实有些指令还

4、可以在指令助记符的前面加上前缀,实现一定的附加操作。如串操作指令前所加的重复前现一定的附加操作。如串操作指令前所加的重复前缀缀REP(见第见第7章介绍)等。章介绍)等。如如ADD、MOV指令需要两个操作数,指令需要两个操作数,INC、NOT指指令只需一个操作数,而令只需一个操作数,而CLC指令不需要操作数。指令不需要操作数。44.注释字段注释字段例:例:LABEL1:ADD AX,BX;功能为功能为AXMOV AX ,0FF0FHMOV AL , NOT 0F0H =MOV AL , 0FHMOV BL , 55H AND 0F0H =MOV BL,50HMOV BH , 55H OR 0F0

5、H =MOV BH, 0F5HMOV CL , 55H XOR 0F0H =MOV CL, 0A5H三、关系运算符三、关系运算符关系运算符包括:关系运算符包括:EQ(等于)、等于)、NE(不等于)、不等于)、LT(小小于)、于)、 LE(小于等于)、小于等于)、GT(大于)、大于)、 GE(大于等于)大于等于)39 关系运算符用于比较两个表达式的大小。关系运算符关系运算符用于比较两个表达式的大小。关系运算符比较的两个表达式必须同为常数或同一逻辑段中的变量。比较的两个表达式必须同为常数或同一逻辑段中的变量。 如果是常量的比较,则按无符号数进行比较;如果是如果是常量的比较,则按无符号数进行比较;如

6、果是变量的比较,则比较它们的偏移量的大小。变量的比较,则比较它们的偏移量的大小。 关系运算的结果只能是关系运算的结果只能是“真真”(全(全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时,则变量时,则变量VAR的内容为的内容为0FFFFH,否则否则VAR的内容为的内容为0。例例240四、数值返回运算

7、符四、数值返回运算符 该类运算符有该类运算符有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作用作用41该运算符的作用是取变量或标号在段内的

8、偏移量。该运算符的作用是取变量或标号在段内的偏移量。2.OFFSET运算符运算符例如:例如:DATA SEGMENTVAR1 DB 20H DUP(0)VAR2 DW 5A49HADDR 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)=22H42该运算符的作用为取变量或标号的类型属性,并用数字形式该运算符的作用为取变量或标号的类型属性,并用数字形式

9、来表示。对变量来说就是取它的字节长度。来表示。对变量来说就是取它的字节长度。3.TYPE运算符运算符变量变量BYTE 1WORD 2DWORD 4标号标号NEAR -1FAR -2例如:例如:V1 DB ABCDEV2 DW 1234H, 5678HV3 DD V2 ;存放存放V2的段基值和偏移量的段基值和偏移量 MOV AL , TYPE V1 MOV CL , TYPE V2 MOV CH , TYPE V3上述程序段汇编后的等效指令序列如下:上述程序段汇编后的等效指令序列如下:43MOV AL,01HMOV CL,02HMOV CH,04H 该运算符只能加在变量的前面。如果变量是用重复数

10、该运算符只能加在变量的前面。如果变量是用重复数据操作符据操作符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.44MOV AL, LENGTH K1; (AL)=10HMOV BL, LENGTH K2 ; (BL)=1MOV CX, LENGTH K3 ; (CX)=20HMOV DX, LENGTH K4 ; (DX)=1

11、该运算符只能作用于变量,该运算符只能作用于变量,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)=145五、属性修改运算符五、属性修改运算符 这一类运算符用来对变量、标号或存储器操作数的类这一类运算符用来对变量、标号或存储器操作数的类型属性进行修改或指定。

12、型属性进行修改或指定。 1.PTR运算符运算符类型类型 PTR 地址表达式地址表达式使用格式:使用格式:作用作用: 将地址表达式所指定的标号、变量或用其它形式表将地址表达式所指定的标号、变量或用其它形式表示的存储器地址的类型属性修改为示的存储器地址的类型属性修改为 “类型类型”所指的值。所指的值。类型可以是类型可以是BYTE、WORD、DWORD、NEAR和和FAR。这种修改是临时性的,只在含有该运算符的语句内有效。这种修改是临时性的,只在含有该运算符的语句内有效。46例如:例如: DA_BYTE DB 20H DUP(0)DA_WORD DW 30H DUP(0) .MOV AX , WOR

13、D PTR DA_BYTE10ADD BYTE PTR DA_WORD20, BLINC BYTE PTR BX SUB WORD PTR SI, 100JMP FAR PTR SUB1;指明指明SUB1不是本段中的地址不是本段中的地址2.HIGH/LOW运算符运算符HIGH 表达式表达式 LOW 表达式表达式使用格式:使用格式:这两个运算符用来将一个数据分离出高字节和低字节。这两个运算符用来将一个数据分离出高字节和低字节。47如果表达式为一个常量,则将其分离成高如果表达式为一个常量,则将其分离成高8位和低位和低8位;位;如果表达式是一个地址(段基值或偏移量)时,则分如果表达式是一个地址(段基

14、值或偏移量)时,则分离出它的高字节和低字节。离出它的高字节和低字节。例如:例如: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,则上则上述指令序列汇编后的等效指令为述指令序列汇编后的等效指令为:M

15、OV AH , 0ABHMOV AL , 0CDHMOV BH , 00HMOV BL , 10HMOV CH , 09HMOV CL , 26H48注意注意:HIGH/LOW运算符不能用来分离一个变量、寄运算符不能用来分离一个变量、寄存器或存储器单元的高字节与低字节。存器或存储器单元的高字节与低字节。下面语句使用是错误的用法。下面语句使用是错误的用法。DA1 DW 1234HMOV AH,HIGH DA1MOV BH, LOW AXMOV CH,HIGH SI493、THIS运算符运算符 THIS运算符一般与等值运算符运算符一般与等值运算符EQU连用,用来定连用,用来定义一个变量或标号的类型

16、属性。所定义的变量或标号的义一个变量或标号的类型属性。所定义的变量或标号的段基值和偏移量与紧跟其后的变量或标号相同。段基值和偏移量与紧跟其后的变量或标号相同。例如:例如: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可可以被其它段的指

17、令调用。以被其它段的指令调用。50六、运算符的优先级六、运算符的优先级在一个表达式中如果存在多个运算符时,在计算时就有先在一个表达式中如果存在多个运算符时,在计算时就有先后顺序问题。不同的运算符具有不同的运算优先级别。后顺序问题。不同的运算符具有不同的运算优先级别。 优先级别优先级别 运算符运算符(最高)(最高)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,XOR51汇编程序在计算表达式时

18、,按以下规则进行运算。汇编程序在计算表达式时,按以下规则进行运算。先执行优先级别高的运算,再算较低级别运算;先执行优先级别高的运算,再算较低级别运算;相同优先级别的操作,按照在表达式中的顺序,从相同优先级别的操作,按照在表达式中的顺序,从左到右进行;左到右进行;可以用圆括号改变运算的顺序可以用圆括号改变运算的顺序。例如:例如:K1= 10 OR 5 AND 1 ;结果为结果为K1=11K2=(10 OR 5) AND 1 ;结果为结果为K2=1524.5 程序的段结构程序的段结构 8086/8088在管理内存时,需要按照逻辑段进行划在管理内存时,需要按照逻辑段进行划分,不同的逻辑段可以用来存放

19、不同目的的数据。在分,不同的逻辑段可以用来存放不同目的的数据。在程序中使用四个段寄存器程序中使用四个段寄存器CS,DS,ES和和SS来访问它们。来访问它们。在源程序设计时,使用伪指令来定义和使用这些逻辑段。在源程序设计时,使用伪指令来定义和使用这些逻辑段。53段名段名 SEGMENT 定位类型定位类型 组合类型组合类型 类别名类别名 . . . 本段语句序列本段语句序列 .段名段名 ENDS一般格式:一般格式: 一、段定义伪指令一、段定义伪指令 伪指令伪指令SEGMENT和和ENDS用于定义一个逻辑段。使用于定义一个逻辑段。使用时必须配对用时必须配对,分别表示定义的开始与结束。分别表示定义的开

20、始与结束。54 段名是由用户自己任意选定的,符合标识符定义段名是由用户自己任意选定的,符合标识符定义规则的一个名称。规则的一个名称。段定义伪指令语句各部分的作用如下:段定义伪指令语句各部分的作用如下:1、段名、段名 最好选用与该逻辑段用途相关的名称。如第一个数最好选用与该逻辑段用途相关的名称。如第一个数据段为据段为DATA1,第二个数据为第二个数据为DATA2等。等。 一个段的开始与结尾用的段名必须一致。一个段的开始与结尾用的段名必须一致。552、定位类型、定位类型 定位类型用于决定段的起始边界,即第一个可存放数据定位类型用于决定段的起始边界,即第一个可存放数据的位置(不是段基址)。它可以有的

21、位置(不是段基址)。它可以有4种取值。种取值。 由于一个页面为由于一个页面为256个字节,并且页面编号从个字节,并且页面编号从0开始,因此,开始,因此,PAGE定位类型的段起始地址的最后定位类型的段起始地址的最后8位二进制数一定为位二进制数一定为0,即以即以00H结尾的地址。结尾的地址。(1)PAGE: 表示该段从一个页面的边界开始表示该段从一个页面的边界开始(2)PARA:表示该段从一个小节的边界开始表示该段从一个小节的边界开始如果用户未选定位类型,则缺省为如果用户未选定位类型,则缺省为PARA。56(3)WORD:表示该段从一个偶数字节地址开始,即段起始表示该段从一个偶数字节地址开始,即段

22、起始单元地址的最后一位二进制数一定是单元地址的最后一位二进制数一定是0。(4)BYTE:表示该段起始单元地址可以是任一地址值。表示该段起始单元地址可以是任一地址值。注意注意:定位类型为:定位类型为PAGE和和PARA时,段起始地址与段基址时,段起始地址与段基址相同。定位类型为相同。定位类型为WORD和和BYTE时,段起始地址与段基址时,段起始地址与段基址可能不同。可能不同。57(1) NONE:若未指定组合类型,表示本段与其它段无连接若未指定组合类型,表示本段与其它段无连接关系。在装入内存时,本段有自己的物理段,因此有自己的关系。在装入内存时,本段有自己的物理段,因此有自己的段基址。段基址。3

23、、组合类型、组合类型 组合类型说明符用来指定段与段之间的连接关系和定位。组合类型说明符用来指定段与段之间的连接关系和定位。它有六种取值选择。它有六种取值选择。(2)PUBLIC:在满足定位类型的前提下,将与该段同名的段在满足定位类型的前提下,将与该段同名的段邻接在一起,形成一个新的逻辑段,共用一个段基址。段内邻接在一起,形成一个新的逻辑段,共用一个段基址。段内的所有偏移量调整为相对于新逻辑段的段基址。的所有偏移量调整为相对于新逻辑段的段基址。(3)COMMON: 产生一个覆盖段。在多个模块连接时,把产生一个覆盖段。在多个模块连接时,把该段与其它也用该段与其它也用COMMON说明的同名段置成相同

24、的段基址,说明的同名段置成相同的段基址,这样就达到了共享同一存储区。共享存储区的长度由同名段这样就达到了共享同一存储区。共享存储区的长度由同名段中最大的段确定。中最大的段确定。58(4)STACK:把所有同名段连接成一个连续段,且系统自动把所有同名段连接成一个连续段,且系统自动对对SS段寄存器初始化为该连续段的段基址。并初始化堆栈指段寄存器初始化为该连续段的段基址。并初始化堆栈指针针SP。 用户程序中应至少有一个段用用户程序中应至少有一个段用STACK说明,否则需要用说明,否则需要用户程序自己初始化户程序自己初始化SS和和SP。(5)AT表达式表达式:表示本段可定位在表达式所指示的小节边界:表

25、示本段可定位在表达式所指示的小节边界上。表达式的值也就是段基值。上。表达式的值也就是段基值。(6)MEMORY:表示本段在存储器中应定位在所有其它段这表示本段在存储器中应定位在所有其它段这之后的最高地址上。如果有多个用之后的最高地址上。如果有多个用MEMORY说明的段,则只说明的段,则只处理第一个用处理第一个用MEMORY说明的段。其余的被视为说明的段。其余的被视为COMMON.59 类别名为某一个段或几个相同类型段设定的类型名称。类别名为某一个段或几个相同类型段设定的类型名称。系统在进行连接处理时,把类别名相同的段存放在相邻的存系统在进行连接处理时,把类别名相同的段存放在相邻的存储区,但段的

26、划分与使用仍按原来的设定。储区,但段的划分与使用仍按原来的设定。4.类别名类别名 类别名必须用单引号引起来。所用字符串可任意选定,类别名必须用单引号引起来。所用字符串可任意选定,但它不能使用程序中的标号、变量名或其它定义的符号。但它不能使用程序中的标号、变量名或其它定义的符号。 在定义一个段时,段名是必须有的项,而定位类型、组在定义一个段时,段名是必须有的项,而定位类型、组合类型和类别名三个参数是可选项。各个参数之间用空格分合类型和类别名三个参数是可选项。各个参数之间用空格分隔。各参数之间的顺序不能改变。隔。各参数之间的顺序不能改变。下面是一个分段结构的源程序框架。下面是一个分段结构的源程序框

27、架。60STACK1 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 61 上述源程序经上述源程序经LINK程序程序进行连接处理后,程序被装入进行连接处理后,程序被装入内存的情况如右

28、图所示。内存的情况如右图所示。如果在段定义中选用了如果在段定义中选用了PARA定位类型说明,则在一个段的定位类型说明,则在一个段的结尾与另一个段的开始之间可结尾与另一个段的开始之间可能存在一些空白,图中以兰色能存在一些空白,图中以兰色框表示。框表示。CODE段的组合类型段的组合类型为为MEMORY,因此被装入在其因此被装入在其它段之后。它段之后。 在进行程序设计时,如果程序不大,一般只需要定在进行程序设计时,如果程序不大,一般只需要定义三个段就可以了。义三个段就可以了。0000HSTACK1STACK2DATA1DATA2CODE间隔间隔62 二、段寻址伪指令二、段寻址伪指令 段寻址伪指令段寻

29、址伪指令ASSUME的作用是告诉汇编程序的作用是告诉汇编程序,在处理在处理源程序时,定义的段与哪个寄存器关联。源程序时,定义的段与哪个寄存器关联。ASSUME 段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,段寄存器名:段名,. 一般格式一般格式 :其中段寄存器名为其中段寄存器名为CS,DS,ES和和SS四个之一,段名是用四个之一,段名是用SEGMENT/ENDS伪指令定义的段名。伪指令定义的段名。 ASSUME并不设置各个段寄存器的具体内容,段寄存器并不设置各个段寄存器的具体内容,段寄存器的值是在程序运行时设定的。的值是在程序运行时设定的。63DATA1 SEGMENTVAR1 DB

30、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,即指令编码中有段前缀即指令编码中有段前缀64在一个代码段中可以有几条在一个代码段中可以有几条ASSUME伪指令,对于前面的设伪指令,对于前面

31、的设置,可以用置,可以用ASSUME改变原来的设置。改变原来的设置。一条一条ASSUME语句不一定设置全部段寄存器,可以选择其中语句不一定设置全部段寄存器,可以选择其中一个或几个段寄存器。一个或几个段寄存器。可以使用关键字可以使用关键字NOTHING将前面的设置删除。将前面的设置删除。ASSUME ES:NOTHING ;删除前面对删除前面对ES与某个定义段的关联与某个定义段的关联ASSUME NOTHING ;删除全部删除全部4个段寄存器的设置个段寄存器的设置例如:例如:65三、段寄存器的装入三、段寄存器的装入 段寄存器的初值(段基值)装入需要用程序的方法来实段寄存器的初值(段基值)装入需要

32、用程序的方法来实现。四个段寄存器的装入方法略有不同。现。四个段寄存器的装入方法略有不同。 在程序中,使用数据传送语句来实现对在程序中,使用数据传送语句来实现对DS和和ES的装入。的装入。1、DS和和ES的装入的装入66DATA1 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 DBYTE

33、22,AL .CODE ENDS 例如:例如:该指令在汇编时出错,该指令在汇编时出错,因为在因为在ASSUME指令指令中未指定中未指定ES与与DATA2的联系。的联系。 67 为了改正上述程序中的错误,可以在变量为了改正上述程序中的错误,可以在变量DBYTE2前加一个段前缀说明即可。即:前加一个段前缀说明即可。即: MOV ES:DBYTE22, ALSS的装入有两种方法的装入有两种方法2、SS的装入的装入(1)在段定义伪指令的组合类型项中,使用)在段定义伪指令的组合类型项中,使用STACK参数,参数,并在段寻址伪指令并在段寻址伪指令ASSUME语句中把该段与语句中把该段与SS段寄存器段寄存器

34、关联。关联。68STACK1 SEGMENT PARA STACK DB 40H DUP(?)STACK1 ENDS .CODE SEGMENT ASSUME CS:CODE,SS:STACK1 .例如:例如: SS将被自动装入将被自动装入STACK1段的段基值,堆栈指针段的段基值,堆栈指针SP也也将指向堆栈底部将指向堆栈底部+2的存储单元。上例中(的存储单元。上例中(SP)=40H。(2)如果在段定义伪指令的组合类型中,未使用)如果在段定义伪指令的组合类型中,未使用STACK参参数,或者是在程序中要调换到另一个堆栈,这时,可以使数,或者是在程序中要调换到另一个堆栈,这时,可以使用类似于用类似

35、于DS和和ES的装入方法。的装入方法。69DATA_STACK SEGMENT DB 40H DUP(?) TOP LABEL WORDDATA_STACK ENDS .CODE SEGMENT . MOV AX,DATA_STACK MOV SS,AX MOV SP,OFFSET TOP .例如:例如:TOP变量的偏移量为40H70 CS保存的是当前目标代码的段基值,而保存的是当前目标代码的段基值,而IP提供下一条将提供下一条将要执行的目标代码的偏移量。要执行的目标代码的偏移量。CPU在执行指令之前根据在执行指令之前根据CS和和IP的内容来从内存中提取指令。因此,必须在程序执行之前的内容来从

36、内存中提取指令。因此,必须在程序执行之前装入装入CS和和IP的值。由于这时程序还没有运行,就无法用几条的值。由于这时程序还没有运行,就无法用几条可执行语句来装入可执行语句来装入CS和和IP。3、CS的装入的装入 END 起始地址起始地址装入装入CS和和IP一般有下面两种情况。一般有下面两种情况。(1)按照结束伪指令指定的地址装入按照结束伪指令指定的地址装入CS和和IP任何一个源程序都必须以任何一个源程序都必须以END伪指令来结束。伪指令来结束。 起始地址可以是一个标号或表达式,它与程序中第一条起始地址可以是一个标号或表达式,它与程序中第一条指令语句前所加的标号必须一致。指令语句前所加的标号必须

37、一致。其格式为:其格式为:71 END伪指令的作用是标识源程序结束和指定程序运行时伪指令的作用是标识源程序结束和指定程序运行时的起始地址。当程序被装入内存时,根据起始地址的段基值的起始地址。当程序被装入内存时,根据起始地址的段基值和偏移量分别自动装入和偏移量分别自动装入CS和和IP中。中。 .CODE SEGMENT ASSUME CS:CODE,.START: . .CODE ENDS END START例如:例如:72(2)在程序运行期间,当执行某些指令时,在程序运行期间,当执行某些指令时,CPU自动修改自动修改CS和和IP,使它们指向新的代码段。使它们指向新的代码段。 执行段间过程调用执

38、行段间过程调用CALL和段间返回指令和段间返回指令RET; 执行段间无条件转移指令执行段间无条件转移指令JMP; 响应中断及中断返回指令;响应中断及中断返回指令; 执行硬件复位操作。执行硬件复位操作。例如:例如:73 在程序设计过程中,常常将具有一定功能的程序段设计成一在程序设计过程中,常常将具有一定功能的程序段设计成一个子程序。在个子程序。在MASM宏汇编程序中,用过程宏汇编程序中,用过程(PROCEDURE)来构来构造子程序。造子程序。4.6 过程定义伪指令(过程定义伪指令(PROC/ENDP)过程名过程名 PROC NEAR/FAR . RET .过程名过程名 ENDP过程定义伪指令格式

39、如下:过程定义伪指令格式如下:74其中,过程名是该子程序的名称,它被用作过程调用指令其中,过程名是该子程序的名称,它被用作过程调用指令CALL的目的操作数。它类同一个标号的作用。具有段、偏的目的操作数。它类同一个标号的作用。具有段、偏移量和距离三个属性。而距离属性使用移量和距离三个属性。而距离属性使用NEAR和和FAR来指定,来指定,若没有指定,则隐含为若没有指定,则隐含为NEAR。NEAR过程只能被本段指令调用,而过程只能被本段指令调用,而FAR过程可以供其它段过程可以供其它段的指令调用。的指令调用。每一个过程中必须包含有返回指令每一个过程中必须包含有返回指令RET,其作用是控制其作用是控制

40、CPU从从子程序中返回到调用该过程的主程序。子程序中返回到调用该过程的主程序。75 4.7 当前位置计数器当前位置计数器$与定位伪指令与定位伪指令ORG(Origin) 汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其汇编程序在汇编源程序时,每遇到一个逻辑段,就要为其设置一个位置计数器,它随时记录着定义的每一个数据或每设置一个位置计数器,它随时记录着定义的每一个数据或每一条指令在程序中的位置。一条指令在程序中的位置。 在源程序中,使用符号在源程序中,使用符号$来表示位置计数器的当前值。因来表示位置计数器的当前值。因此,此,$被称为当前计数器。它位于不同的位置具有不同的值。被称为当前计数器。它

41、位于不同的位置具有不同的值。位置计数器位置计数器$在使用上完全类似变量的使用在使用上完全类似变量的使用.76作用:将数值表达式的值赋给当前位置计数器。作用:将数值表达式的值赋给当前位置计数器。ORG语句语句为其后的数据或指令设置起始偏移量。为其后的数据或指令设置起始偏移量。 表达式的值必须为正值。表达式中也可以包含有当前表达式的值必须为正值。表达式中也可以包含有当前位置计数器的现行值位置计数器的现行值$。定位伪指令定位伪指令ORG用来改变位置计数器的值。用来改变位置计数器的值。 ORG 数值表达式数值表达式格式:格式:77DATA1 SEGMENT ORG 30H DB1 DB 12H,34H

42、 ;DB1在在DATA1段内的偏移量为段内的偏移量为30H ORG $+20H;保留保留20H个字节单元,其后再存放个字节单元,其后再存放ABCD. STRING DB ABCDEFGHI COUT EQU $-STRING;计算计算STRING的长度的长度 DB2 DW $; 取取$的偏移量的偏移量,类似变量的用法类似变量的用法 DB3 DB $ ;此语句错误此语句错误! DATA1 ENDS CODE SEGMENT ASSUME CS:CODE. ORG 10H START: MOV AX,DATA MOV DS,AX . CODE ENDS END START784.8 标题伪指令标题

43、伪指令TITLETITLE 标题名标题名语句格式:语句格式:作用:给所在程序指定一个标题。以便在列表文件的每一页作用:给所在程序指定一个标题。以便在列表文件的每一页的第一行都显示这个标题。其中标题是用户任意选用的字符的第一行都显示这个标题。其中标题是用户任意选用的字符串,字符个数不能超过串,字符个数不能超过60。79一、使用程序段前缀一、使用程序段前缀PSP(Program Segment Prefix)实现返回实现返回4.10 从程序返回操作系统的方法从程序返回操作系统的方法 为了使程序运行结束后,能够正确地返回到操作系统,为了使程序运行结束后,能够正确地返回到操作系统,需要在用户程序中加上

44、一些必要的语句。一般有以下两种需要在用户程序中加上一些必要的语句。一般有以下两种方法。方法。 DOS系统将一个系统将一个.EXE(可执行文件)装入内存时,在该可执行文件)装入内存时,在该文件的前面生成一个程序段前缀文件的前面生成一个程序段前缀PSP,其长度为其长度为100H字节。字节。同时让同时让DS和和ES都指向都指向PSP的开始,而的开始,而CS指向该程序的代码指向该程序的代码段,即第一条可执行指令。段,即第一条可执行指令。80为了使程序执行完后,正确返回为了使程序执行完后,正确返回DOS,需要做以下三个工作:需要做以下三个工作: 1. 将用户程序编制成一个过程,类型为将用户程序编制成一个

45、过程,类型为FAR; 2. 将将PSP的起始逻辑地址压栈,即将的起始逻辑地址压栈,即将INT 20H指令的地址压栈指令的地址压栈;如图所示。如图所示。PSP中一开始就中一开始就是一条中断指令是一条中断指令 INT 20H,执行该指令将终止用户程序,执行该指令将终止用户程序,返回返回DOS系统。系统。813. 在用户程序结束时在用户程序结束时,使用使用RET指令。执行该指令将使保存指令。执行该指令将使保存在堆栈中的在堆栈中的INT 20H 的逻辑地址弹出到的逻辑地址弹出到CS和和IP中。中。DATA SEGMENTDATA SEGMENT DATA ENDSDATA ENDSSTACK1 SEG

46、MENT STACKSTACK1 SEGMENT STACK STACK1 ENDSSTACK1 ENDSCODE SEGMENTCODE SEGMENTBEGIN PROC FARBEGIN PROC FAR ASSUME CS:CODE,DS:DATA,SS:STACK1 ASSUME CS:CODE,DS:DATA,SS:STACK1START: PUSH DSSTART: PUSH DS MOV AX,0 MOV AX,0 PUSH AX PUSH AX 程序结构如下:程序结构如下:82 MOV AX,DATA MOV AX,DATA MOV DS,AX MOV DS,AX RET R

47、ETBEGIN ENDPBEGIN ENDPCODE ENDSCODE ENDS END START END START 二、使用二、使用DOS系统功能调用实现返回系统功能调用实现返回 执行执行DOS功能调用功能调用4CH,也可以控制用户程序结束,也可以控制用户程序结束,并返回并返回DOS操作系统。操作系统。 MOV AH,4CH INT 21H具体方法是在程序结束时,使用两条指令:具体方法是在程序结束时,使用两条指令:83CODE SEGMENTCODE SEGMENT ASSUME CS:CODE. ASSUME CS:CODE.BEGIN:MOV AX,DATABEGIN:MOV AX,DATA MOV DS,AX MOV DS,AX MOV AH,4CH MOV AH,4CH INT 21H INT 21HCODE ENDSCODE ENDS END BEGIN END BEGIN用户程序的代码段的结构为:用户程序的代码段的结构为:84作业:作业:P7476 1, 4, 8, 11, 1385

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号