《第四章汇编语言程序格式.ppt》由会员分享,可在线阅读,更多相关《第四章汇编语言程序格式.ppt(56页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第4章 汇编语言程序格式汇编程序功能伪操作汇编语言程序格式汇编语言程序的上机过程4.1汇编程序功能 EDIT MASM LINK 图4.1汇编语言程序的建立及汇编过程源文件源文件.asm编编辑辑程程序序连连接接程程序序汇汇编编程程序序目标文目标文件件.obj可执可执行文件行文件.exe一、汇编语言源程序和汇编程序汇编程序汇编程序的作用的作用就是把源程序文件(就是把源程序文件(ASMASM文件)转换成用文件)转换成用二进制代码表示的目标程序文件(二进制代码表示的目标程序文件(OBJOBJ文件)。文件)。汇编程序汇编程序的主要功能有的主要功能有:检查源程序。检查源程序。测出源程序语法错误,并给出错
2、误。测出源程序语法错误,并给出错误。产生目标程序,并可给出列表文件产生目标程序,并可给出列表文件 展开宏指令。展开宏指令。1 1、汇编语言源程序汇编语言源程序汇编语言源程序是用汇编语言编写的程序,简称汇编语言程序。汇汇编语言源程序是用汇编语言编写的程序,简称汇编语言程序。汇 编语言程序通过编辑程序在计算机中建立汇编语言源程序文件编语言程序通过编辑程序在计算机中建立汇编语言源程序文件 (ASMASM文件)。文件)。2 2、汇编程序汇编程序将汇编语言源程序编译成目标程序的加工程序称为汇编程序。这一将汇编语言源程序编译成目标程序的加工程序称为汇编程序。这一 加工过程称为汇编。加工过程称为汇编。二、为
3、运行汇编语言程序 要在磁盘上建立如下文件:1 1、EDIT.EXE EDIT.EXE(编辑程序)(编辑程序)2 2、MASM.EXE MASM.EXE(汇编程序)(汇编程序)3 3、LINK.EXE LINK.EXE(连接程序)(连接程序)4 4、DEBUG.COMDEBUG.COM(调试程序)(调试程序)5 5、EXE2BIN.EXEEXE2BIN.EXE (将(将EXEEXE文件转换成文件转换成COMCOM文件)文件)可选可选伪指令属于汇编控制命令,它所指示的操作是由汇编程序在汇编源程序时完成的,在汇编时,它不产生目标代码,在将源程序汇编成目标程序后,它就不复存在了。4.2伪指令 伪指令又
4、称为伪操作,伪指令是汇编语言程序设计的一个重要部 分,由于汇编程序在汇编过程中无法区分源程序中的分段情况,哪 些是数据,哪些是指令,也无法识别数据的类型,以及源程序在哪 结束,因此,80X86宏汇编语言提供了多种伪指令,它主要告诉汇编 程序如何正确地将汇编源程序汇编成目标程序。伪指令语句功能:指示汇编程序在汇编源程序时完成某些工作,比 如完成数据定义、分配存储区、指示程序结束等。一条伪指令语句也由四个字段组成,其一般格式如下:一条伪指令语句也由四个字段组成,其一般格式如下:符号名符号名 伪指令符操作数伪指令符操作数;注释;注释 4.2伪指令一、段结构伪指令 编制一个80X86汇编语言源程序,段
5、是基础,这有两方 面含义:一是必须按段来构造程序,二是在程序执行 时,要凭借四个段寄存器对各个段的存储单元进行访 问。段结构伪指令主要有两条语句,即段定义伪指令 和段寻址伪指令。4.2伪指令(一)、段定义伪指令1、段定义伪指令的格式段名段名 SEGMENTSEGMENT 定位类型定位类型 组合类型组合类型 类别类别 段体段体段名段名 ENDSENDS2、段定义伪指令的功能指定逻辑段的名字、范围、段的起始边界、段与段之间的连接关系。段定义伪指令中的SEGMENT和ENDS用于定义一个逻辑段,使用时必须成对出现,分别表示段的起始和结束。4.2伪指令(二)、段寻址伪指令1、段寻址伪指令的格式ASSU
6、MEASSUME 段寄存器:段名段寄存器:段名 【,段寄存器:段名段寄存器:段名】2、段寻址伪指令的功能主要用于指示汇编程序哪些段是当前段以及这些段与段寄存器之间的对应关系。例:ASSUME CS:CODE,DS:DATA,SS:STACKASSUME CS:CODE,DS:DATA,SS:STACKCODEDATASTACKCSDSSS对段寻址伪指令的几点说明:段寄存器名可为CS、DS、SS、ES四者之一。段名是指用SEGMENT/ENDS语句已定义的段名,也可以是表达式“SEG 变量或标号”,或者是关键字NOTHING;(使用NOTHING时,来取消段寄存器与段之间的对应关系)。ASSUM
7、E伪指令设置在代码段内,第一个ASSUME语句一般放在段定义语句之后,是说明性语句。在一个代码段中,如果没有另外的ASSUME伪指令重新设置,原有ASSUME语句的设置一直有效。不在当前段中的变量和数据存储单元均是不可访问的,否则,会在汇编时产生错误或运行时造成混乱,产生逻辑上的错误,得出错误结果。ASSUME伪指令不产生任何目标代码,它仅仅是告诉汇编程序,哪些段是当前段,而且它们分别由哪个段寄存器指向。汇编程序不能检查在程序运行期间段寄存器内容是否与上述ASSUME语句的设置一致。如果在程序中间用ASSUME语句重建了DS或ES与某段的关系时,就一定要紧跟着将这个新段首地址送入DS或ES中,
8、否则,会因段寄存器的内容未更改而使得后面数据的读写仍在原来的数据段中进行,这样的错误,系统是检查不出来的,即出现逻辑错误。定位类型定位类型说明段的起始地址应有怎样的边界,它们可以是:PARA:指定段的起始地址必须从小段边界开始,即 段起始地址的最低的十六进制数必须为0。这 样偏移地址可以从0开始。(默认)BYTE:该段可以从任何地址开始。这样起始偏移地 址可能不为0。WORD:该段必须从字的边界开始,即段起始地址必 须为偶数。DWORD:该段必须从双字的边界开始,即段起始地址 的最低的十六进制数必须为4的倍数。PAGE:该段必须从页的边界开始,即段起始地址的最低的两 位十六进制数必须为0。(能
9、被256整除)组合类型组合类型说明程序连接时的段合并方法,它们可以是:PRIVATE:该段为私有段,在连接时将不与其他模块中的同名分段合并。(默认)PUBLIC:该段连接时可以把不同模块中的同名段相连接而形成一个段,其连接次序由连接命令指定。每一分段都从小段的边界开始,因此各模块的原有段之间可能存在小于16个字节的空隙。(MEMORY与PUBLIC同义)COMMON:该段连接时可以把不同模块中的同名段重叠而形成一个段,由 于各同名段有相同的起始地址,所以会产生覆盖。COMMON的连 接长度时各分段中的最大长度。重叠部分的内容取决于排列在 最后一段的内容。STACK:把不同模块中的同名段组合而形
10、成一个堆栈段。该段的长度为 原有段的总和,各原有段之间无PUBLIC所连接段中的间隙,而 且栈顶可自动指向连接后形成的大堆栈段的栈顶。AT expression:使段地址是表达式所计算出来的16位值。但它不能用来 指定代码段。类别在引号中给出连接时组成段的类型名。类别说明并不能把相同类别的段合并起来,但在连接后形成的装入模块中,可以把它们的位置靠在一起。(LINK MUSIC+GROUNDLINK MUSIC+GROUNDLINK MUSIC+GROUNDLINK MUSIC+GROUND)例:STACK1 SEGMENT PARA STACK STACK DB 80 DUP (0)STACK
11、1 ENDSTITLE伪指令可指定每一页上打印的标题。同时,若程序中没有NAME伪指令,则汇编程序将用text 中的前6个字符作为模块名。text最多可有60个字符。若程序中既无NAME又无TITLE伪指令,则将用源程序名作为模块名。所以NAME及TITLE伪指令并不是必要的,但一般常使用TITLE,以便在列表文件中能打印出标题来。4.2伪指令二、源程序开始和结束伪指令源程序开始和结束伪指令(一)源程序开始伪指令 在源程序开始处可以用NAME或TITLE为模块取名字。TITLE伪指令 如果程序中没有NAME伪指令,则也可使用TITLE伪指令。格式:TITLE text NAME伪指令 格式:N
12、AME 模块名 汇编程序将以给出的“模块名”作为模块的名字。其中,地址表达式为可选项,若选用地址表达式,则表示此程序是 主程序,它可以单独执行,其地址表达式为该程序的启动地址,即 程序开始运行的第一条指令的地址,例如,“ENDSTART”,此 START是第一条指令的标号;若不选用表达式,则说明此程序为一 子程序,不能单独运行,只能被其它程序调用。4.2伪指令二、源程序开始和结束伪指令源程序开始和结束伪指令(二)源程序结束伪指令 格式:END 地址表达式 功能:该语句为源程序的最后一个语句,用以标志整个程序的结 束,即告诉汇编程序汇编工作到此结束。4.2伪指令1 1、常用的数据定义伪指令有、常
13、用的数据定义伪指令有DBDB、DWDW、DDDD、DQDQ、DTDT。格式:格式:变量变量 数据定义伪指令数据定义伪指令 表达式表达式 ,表达式,表达式,功能:定义数据存储区,类型由数据定义伪指令确定,初值功能:定义数据存储区,类型由数据定义伪指令确定,初值 由表达式给定。由表达式给定。三、数据定义伪指令例:DATA SEGMENT DATA1 DB 12H,34H,56H,78H,9AH DATA2 DW 1234H,5678H DATA3 DD 12345678H DATA ENDS12H34H56H78H9AH34H12H78H56H78H56H34H12HDATA1DATA2DATA3
14、2 2、符号定义伪指令、符号定义伪指令 符号定义伪指令用于为程序中多次出现的同一个常量或表达式定符号定义伪指令用于为程序中多次出现的同一个常量或表达式定 义为一个标识符,以便在源程序中以标识符来代替对应的常量或义为一个标识符,以便在源程序中以标识符来代替对应的常量或 表达式。符号定义伪指令有以下两种。表达式。符号定义伪指令有以下两种。(1)(1)等价伪指令等价伪指令EQUEQU 格式:符号名格式:符号名 EQU EQU 表达式表达式 功能:为常量或表达式及其它各种符号定义一个等价的符号名功能:为常量或表达式及其它各种符号定义一个等价的符号名 ,但它不申请分配存储单元。但它不申请分配存储单元。三
15、、数据定义伪指令说明:说明:表达式可以是常量或数值表达式;地址表达式;变量、标号或表达式可以是常量或数值表达式;地址表达式;变量、标号或 指令助记符指令助记符.符号名符号名不占存储单元不占存储单元,没有段、偏移和类型,没有段、偏移和类型3 3种属性种属性.在同一源程序中,使用在同一源程序中,使用EQUEQU定义的符号不能与本程序中的其它定义的符号不能与本程序中的其它 符号名同名;另外,同一符号符号名同名;另外,同一符号不能不能用用EQUEQU伪指令伪指令重新重新定义。定义。EQUEQU伪指令主要有以下伪指令主要有以下3 3方面应用:方面应用:定义符号常量。用符号名表示常量、数值表达式。定义符号
16、常量。用符号名表示常量、数值表达式。EQUEQU与属性运算符与属性运算符PTRPTR或或THISTHIS连用,可以给变量或标号定义新的类型连用,可以给变量或标号定义新的类型 属性并重新命名。但其段属性和偏移属性不变。属性并重新命名。但其段属性和偏移属性不变。利用利用EQUEQU可以用一个符号名替代一个复杂的地址表达式和其它一些符可以用一个符号名替代一个复杂的地址表达式和其它一些符 号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。号,如指令助记符、变量名、标号、段名、寄存器名、宏定义名等。三、数据定义伪指令(2 2)等号伪指令等号伪指令 格式:符号名格式:符号名 =表达式表达式 功能
17、:该语句的功能与功能:该语句的功能与EQUEQU语句类似,不同的是等号伪指令能对所语句类似,不同的是等号伪指令能对所 定义的符号名定义的符号名多次重新多次重新定义,且以定义,且以最后一次最后一次定义的值为准。定义的值为准。汇编程序在汇编源程序时,每遇到一新段,就为该段设置一个初汇编程序在汇编源程序时,每遇到一新段,就为该段设置一个初值为值为0 0的的汇编地址计数器汇编地址计数器,汇编程序使用汇编地址计数器记载正,汇编程序使用汇编地址计数器记载正在汇编的数据或指令的目标代码在当前段内的偏移地址。在汇编的数据或指令的目标代码在当前段内的偏移地址。4.2伪指令 当前当前汇编地址计数器汇编地址计数器的
18、的值值可用符号可用符号$表示,表示,用户可在程序中直接使用用户可在程序中直接使用$,表示引用当,表示引用当 前汇编地址计数器的值。例如:前汇编地址计数器的值。例如:ARRAY DW 4000HARRAY DW 4000H,5000H5000H,6000H6000H COUNT EQU COUNT EQU ($-ARRAY$-ARRAY)/2 /2 00H40H00H50H00H60HARRAYARRAY+1ARRAY+2ARRAY+3ARRAY+4ARRAY+5ARRAY+6COUNT四、定位伪指令四、定位伪指令ORGORG与汇编地址计数器(与汇编地址计数器($)ORG伪指令伪指令 格式:格式
19、:ORG 数值表达式数值表达式 功能:将数值表达式的值赋给汇编地址计数器。功能:将数值表达式的值赋给汇编地址计数器。汇编地址计数器的值可以用定位伪指令汇编地址计数器的值可以用定位伪指令ORGORG设置。设置。$4.3汇编语言程序格式(数据与运算符)汇编语言的指令语句和伪指令语句汇编语言的指令语句和伪指令语句操作数操作数一般为一般为常量、变量、标号、常量、变量、标号、表达式表达式。一、常量一、常量(1 1)数值常量数值常量 数值常量分为数值常量分为整数整数和和实数实数。例如:例如:11100011B 11100011B,45693 45693,0FF2AH 0FF2AH,356703Q35670
20、3Q 都是正确的整数形式都是正确的整数形式.又如:又如:543.567543.567,45.2345.23,1.2E21.2E2,45.4E945.4E9 都是正确的实数形式。都是正确的实数形式。常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定,常量是没有任何属性的纯数值,它的值在汇编期间已能完全确定,且在程序运行中也不会发生变化。常量分为且在程序运行中也不会发生变化。常量分为数值常量、字符串常数值常量、字符串常量量和和符号常量符号常量,它主要用于指令语句中的立即数或伪指令语句中,它主要用于指令语句中的立即数或伪指令语句中给变量给变量赋初值赋初值等。等。(2 2)字符串常量字符串常量
21、字符串常量是用字符串常量是用单引号单引号括起来的括起来的一个字符一个字符或或多个字符多个字符。字符串。字符串 常量以单引号中各字符的常量以单引号中各字符的ASCIIASCII码形式存储在内存中,如码形式存储在内存中,如 A A,在内存中就是,在内存中就是41H41H,1212就是就是31H31H,32H32H。使用时可在。使用时可在 单引号内直接写字符序列,如单引号内直接写字符序列,如12AB12AB,也可写字符的,也可写字符的ASCIIASCII 码,码,ASCIIASCII码之间用逗号分隔(此时不需要用单引号),如码之间用逗号分隔(此时不需要用单引号),如 31H31H,32H32H,41
22、H41H,42H42H表示字符串表示字符串12AB12AB。(3 3)符号常量符号常量 符号常量是指用符号常量是指用EQUEQU伪指令或赋值语句伪指令或赋值语句“=”定义过的符号名,可定义过的符号名,可 作操作数项或在表达式中使用。作操作数项或在表达式中使用。一、常量一、常量二、变量二、变量在汇编语言中,变量是一个在汇编语言中,变量是一个数据存储单元数据存储单元的名称,即数据存放地址的名称,即数据存放地址的符号表示。它代表存放在某些存储单元的数据,这些数据在程序的符号表示。它代表存放在某些存储单元的数据,这些数据在程序运行期间运行期间随时可以改变随时可以改变。为方便访问变量,在程序中通过。为方
23、便访问变量,在程序中通过变量名变量名来来使用变量。使用变量。(1)变量的定义变量的定义 变量通常在数据段或附加段中使用数据定义伪指令来定义,定义变量就变量通常在数据段或附加段中使用数据定义伪指令来定义,定义变量就 是给数据分配存储单元,有时为存储单元赋予一个变量名,并可同时为是给数据分配存储单元,有时为存储单元赋予一个变量名,并可同时为 这些存储单元预置初值。这些存储单元预置初值。数据定义伪指令的格式为:数据定义伪指令的格式为:变量名变量名 DB(DWDB(DW、DDDD、DQDQ、DT)DT)表达式表达式1 1,表达式,表达式2 2,其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的
24、地址;其中:变量名是可选项,它仅代表所定义数据存储区第一个单元的地址;DBDB、DWDW、DDDD、DQDQ和和DTDT是伪指令符,具体一条数据定义伪指令取是伪指令符,具体一条数据定义伪指令取5 5种之一。种之一。DBDB定义的是字节类型的变量,每个表达式被分配定义的是字节类型的变量,每个表达式被分配1 1个字节单元。个字节单元。DWDW定义的是字类型的变量,每一个表达式被分配定义的是字类型的变量,每一个表达式被分配1 1个字单元(个字单元(2 2个字节)。个字节)。DDDD定义的是双字类型的变量,每一个表达式被分配定义的是双字类型的变量,每一个表达式被分配2 2个字单元(个字单元(4 4个字
25、节)。个字节)。DQDQ定义的是四字类型的变量,每一个表达式被分配定义的是四字类型的变量,每一个表达式被分配4 4个字单元(个字单元(8 8个字节)。个字节)。DTDT定义的是十字节类型的变量,每一个表达式被分配定义的是十字节类型的变量,每一个表达式被分配1010个字节单元。个字节单元。表达式表达式1 1,表达式,表达式2 2是给变量或指定的存储单元赋予是给变量或指定的存储单元赋予初值初值,它们有以下几种形式:,它们有以下几种形式:(a a)数值表达式)数值表达式 数据定义伪指令可以为一个或连续的存储单元设置数值初值。数据定义伪指令可以为一个或连续的存储单元设置数值初值。(b b)字符串表达式
26、)字符串表达式 对于对于DBDB伪指令,字符串的长度允许超过伪指令,字符串的长度允许超过2 2个字符,但不能超过个字符,但不能超过255255个字符,字符个字符,字符 串必须用单引号括起来,它可为字符串中的每个字符分配串必须用单引号括起来,它可为字符串中的每个字符分配1 1字节单元,字符串字节单元,字符串 从左至右以字符的从左至右以字符的ASCIIASCII码码形式按形式按地址递增地址递增的顺序的顺序依次依次存放。存放。(c c)?表达式)?表达式 不带引号的?,用于为变量不带引号的?,用于为变量预留内存单元预留内存单元,暂时不存入数据,即表示所定义的,暂时不存入数据,即表示所定义的 变量无确
27、定的初值。变量无确定的初值。例如:例如:A DW A DW?,?为变量?,?为变量A A预留预留2 2个字单元。个字单元。(d d)地址表达式)地址表达式 操作数为地址表达式时,只适用于操作数为地址表达式时,只适用于DWDW和和DDDD这两种数据定义伪指令。如果地址表这两种数据定义伪指令。如果地址表 达式为一变量(标号)名,用达式为一变量(标号)名,用DWDW伪指令则是取它的伪指令则是取它的偏移地址偏移地址来初始化变量;用来初始化变量;用 DDDD伪指令则是取它的伪指令则是取它的段首地址段首地址和和偏移地址偏移地址来初始化变量。来初始化变量。(e e)带带DUPDUP的表达式的表达式 格式为:
28、格式为:n DUP (n DUP (表达式表达式),其中,其中n n为为重复重复因子,只能取因子,只能取正整数正整数,它表示定义了,它表示定义了 n n个相同的数据存储单元。个相同的数据存储单元。数据定义伪指令的格式为:数据定义伪指令的格式为:变量名变量名 DB(DW、DD、DQ、DT)表达式表达式1,表达式,表达式2,数据定义伪指令举例数据定义伪指令举例DATA SEGMENT VAR1 DB 10H VAR2 DB?,?,?VAR3 DB ABCD VAR4 DW AB,CD VAR5 DB 2 DUP(1,2)VAR6 DW 2 DUP(AB)VAR7 DB 4 DUP(6,3 DUP(
29、5),7)DATA ENDS10HVAR100H00H00H41H42H43H44H42H41H44H43H01H02H01H02H42H41H42H41HVAR2VAR3VAR4VAR5VAR6VAR7106H05H05H05H07H06H05H05H05H07H06H05H05H05H07H06H05H05H05H07H二、变量二、变量(2 2)变量的属性变量的属性(c)类型属性类型属性(TYPE)变量的类型属性表示存储变量时所占存储单元的变量的类型属性表示存储变量时所占存储单元的字节个数字节个数。由于存储器是分段使用的,因而源程序定义的变量具有由于存储器是分段使用的,因而源程序定义的变量
30、具有3个属性:个属性:(a)段属性段属性(SEG)变量的段属性是指定义变量时它所在段的变量的段属性是指定义变量时它所在段的段首地址段首地址。(b)偏移属性偏移属性(OFFSET)变量的偏移属性是指所在段的段首地址到定义该变量的位变量的偏移属性是指所在段的段首地址到定义该变量的位 置置之间的字节数之间的字节数(即偏移地址)。上述的段属性和偏移属(即偏移地址)。上述的段属性和偏移属 性值就构成了一个变量的逻辑地址。性值就构成了一个变量的逻辑地址。定义后的变量,在程序中的引用有两种情况:定义后的变量,在程序中的引用有两种情况:二、变量二、变量(3 3)变量的使用变量的使用(b)在)在数据定义伪指令数
31、据定义伪指令DW和和DD中,操作数字段可直接引用已定义中,操作数字段可直接引用已定义 过的变量名。过的变量名。如:如:A DB 50H,40H B DW A C DD B(a a)在)在指令指令语句中,采用存储器操作数的几种寻址方式,除寄存器语句中,采用存储器操作数的几种寻址方式,除寄存器 间接寻址方式不使用变量名外,其余各种寻址方式均可使用变间接寻址方式不使用变量名外,其余各种寻址方式均可使用变 量名。量名。例如,某数据段已定义一变量例如,某数据段已定义一变量ARRAYARRAY:ARRAY DW 5000HARRAY DW 5000H,4000H4000H 则在指令中可以使用如下指令:则在
32、指令中可以使用如下指令:MOV AX,ARRAY+2MOV AX,ARRAY+2 MOV AX,ARRAY MOV AX,ARRAY等。等。三、标号三、标号标号是一条指令语句的标号是一条指令语句的符号地址符号地址,在汇编源程序中,只有在需要,在汇编源程序中,只有在需要转向转向一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中一条指令语句时,才为该指令语句设置标号,以便在控制转移指令中直接直接引用这个标号引用这个标号。标号一般在代码段中定义和引用标号一般在代码段中定义和引用。由于标号代表。由于标号代表了指令的符号地址,所以标号也有了指令的符号地址,所以标号也有3 3个属性:个属性:(c
33、)类型属性类型属性(TYPE)。标号的类型属性表示了它的转移特性,即该标号)。标号的类型属性表示了它的转移特性,即该标号 是作为是作为段内段内还是还是段间段间转移(或调用)指令的目标地址。转移(或调用)指令的目标地址。标号的类型属性有标号的类型属性有2种:种:NEAR类型和类型和FAR类型。类型。(a)段属性段属性(SEG)。标号的段属性是指标号定义所在段的)。标号的段属性是指标号定义所在段的段首地址段首地址。(b)偏移属性偏移属性(OFFSET)。标号的偏移属性是指标号所在段的段首地址到)。标号的偏移属性是指标号所在段的段首地址到 该标号的该标号的字节距离字节距离。四、表达式和运算符四、表达
34、式和运算符汇编语言的指令语句和伪指令语句中,表达式是操作数项的常见形式,汇编语言的指令语句和伪指令语句中,表达式是操作数项的常见形式,表达式是由表达式是由常量常量、变量变量、标号标号用用运算符运算符连接而成有意义的式子。表达式连接而成有意义的式子。表达式分为分为数值表达式数值表达式和和地址表达式地址表达式,任一表达式的值只,任一表达式的值只计算一计算一次,次,表达式的表达式的计算是在源程序汇编过程中进行的,而不是在程序运行中进行的计算是在源程序汇编过程中进行的,而不是在程序运行中进行的,汇编,汇编程序将表达式计算后得到一个程序将表达式计算后得到一个数值数值或一个或一个地址地址。在在808680
35、86汇编语言中,汇编语言中,运算符运算符分为:分为:算术算术运算符、运算符、逻辑逻辑运算符、运算符、关系关系运算运算符、符、数值数值返回运算符、返回运算符、属性属性运算符和运算符和字节分离字节分离运算符。运算符。(1)数值表达式)数值表达式 数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意数值表达式是由常量与算术运算符、逻辑运算符或关系运算符构成的有意 义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它义的式子。数值表达式在汇编期间进行运算,运算结果为一数值常量,它 只有大小而没有属性只有大小而没有属性。(2)地址表达式)地址表达式 地址表达式是由常量、变量、标号
36、、寄存器(地址表达式是由常量、变量、标号、寄存器(BX、BP、SI、DI)内容)内容 (用寄存器名加方括号表示)和运算符组成的有意义的式子。单个的变量、(用寄存器名加方括号表示)和运算符组成的有意义的式子。单个的变量、标号、寄存器的内容是地址表达式的特例。标号、寄存器的内容是地址表达式的特例。地址表达式中可以使用算术运算符中的地址表达式中可以使用算术运算符中的“+”、“-”运算符和关系运运算符和关系运算符。在地址表达式中,算符。在地址表达式中,常用的形式常用的形式是:是:变量变量常量常量。地址表达式除使用数值表达式的运算符外,还可以使用特殊算符。地址表达式除使用数值表达式的运算符外,还可以使用
37、特殊算符。包括包括属性属性运算符、运算符、数值返回数值返回运算符、运算符、分离分离运算符等。运算符等。(一)、表达式(a)属性运算符)属性运算符 属性运算符主要用于临时修改变量、标号或某个内存单元中的属性运算符主要用于临时修改变量、标号或某个内存单元中的 操作数的类型属性。操作数的类型属性。段超越前缀段超越前缀“:”。其格式为:其格式为:段寄存器名:地址表达式段寄存器名:地址表达式 或或 段名:地址表达式段名:地址表达式 MOV AX,ES:SI 类型运算符类型运算符PTR。其使用格式为:其使用格式为:类型类型 PTR 地址表达式地址表达式 根据地址表达式的不同值,类型可以是根据地址表达式的不
38、同值,类型可以是BYTE、WORD、DWORD、NEAR、FAR等。等。DATA2 DW 1234H MOV AL,BYTE PTR DATA2 定义类型伪操作符定义类型伪操作符LABEL。其格式为:其格式为:变量名或标号变量名或标号 LABEL 类型类型 DATA1 LABEL DB DATA2 DW 1234H MOV AL,DATA1地址表达式使用的特殊运算符地址表达式使用的特殊运算符地址表达式使用的特殊运算符地址表达式使用的特殊运算符(b b)数值返回运算符)数值返回运算符 数值返回运算符有数值返回运算符有5 5种,这些运算符的运算对象必须是变量或标号,其功能种,这些运算符的运算对象必
39、须是变量或标号,其功能 是分离出变量或标号的段、偏移地址及类型的属性值,运算结果为一数值常量。是分离出变量或标号的段、偏移地址及类型的属性值,运算结果为一数值常量。SEGSEG运算符运算符 格式:格式:SEG SEG 变量或标号变量或标号 功能:分离出其后变量或标号所在段的段首地址。功能:分离出其后变量或标号所在段的段首地址。OFFSETOFFSET运算符运算符 格式:格式:OFFSET OFFSET 变量或标号变量或标号 功能:分离出其后变量或标号的偏移地址。功能:分离出其后变量或标号的偏移地址。TYPETYPE运算符运算符 格式:格式:TYPE TYPE 变量或标号变量或标号 功能:分离出
40、其后变量或标号的类型值。功能:分离出其后变量或标号的类型值。LENGTHLENGTH运算符运算符 格式:格式:LENGTH LENGTH 变量变量 功能:取出变量所含的数据存储单元个数。该运算符只对变量起作用,它的功能:取出变量所含的数据存储单元个数。该运算符只对变量起作用,它的 取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如果取值根据定义该变量时数据定义伪指令后面第一个表达式的形式而定。如果 第一个表达式为重复子句第一个表达式为重复子句“n nDUP DUP(表达式)(表达式)”的形式,则取值为前面的重的形式,则取值为前面的重 复因子复因子n n。如果为其它形式的表达式,则
41、取值均为。如果为其它形式的表达式,则取值均为1 1。SIZESIZE运算符运算符 格式:格式:SIZE SIZE 变量变量 功能:取出变量所含的数据存储区的总字节数。其返回值为该变量的功能:取出变量所含的数据存储区的总字节数。其返回值为该变量的 LENGTHLENGTH值和值和TYPETYPE值的乘积,即:值的乘积,即:LENGTH LENGTH 变量变量*YTPE YTPE 变量变量。例:ARRAY DW 1,2,3FEES DW 100 DUP (0)TABLE DB ABCD ADD SI,TYPE ARRAY MOV CX,LENGTH FEES MOV CX,LENGTH ARRAY
42、 MOV CX,LENGTH TABLE MOV AX,SIZE FEES MOV AX,SIZE ARRAY MOV AX,SIZE TABLE MOV BX,OFFSET OPR1 MOV AX,SEG OPR1ADD SI,2MOV CX,100MOV CX,1MOV CX,1MOV AX,200MOV AX,2MOV AX,1MOV BX,0005HMOV AX,0100H(c)分离运算符)分离运算符 分离高字节运算符分离高字节运算符HIGH。格式:格式:HIGH 常量或地址表达式常量或地址表达式 功能:用来分离出其后功能:用来分离出其后16位常量或地址表达式的偏移地址的高字节。位常量
43、或地址表达式的偏移地址的高字节。分离低字节运算符分离低字节运算符LOW。格式:格式:LOW 常量或地址表达式常量或地址表达式 功能:用来分离出其后功能:用来分离出其后16位常量或地址表达式的偏移地址的低字节。位常量或地址表达式的偏移地址的低字节。(d)其他运算符)其他运算符 SHORT运算符:用于说明其后的标号在短距离运算符:用于说明其后的标号在短距离 (-128-127之间)内。之间)内。()运算符用于改变运算的优先级别。()运算符用于改变运算的优先级别。运算符用于表示间接寻址。运算符用于表示间接寻址。地址表达式使用的特殊运算符地址表达式使用的特殊运算符4.4汇编语言程序的上机过程一、基本汇
44、编语言程序的结构 源程序是由多各段组成的,一个可执行的汇编源程序 一般至少由一个代码段,其中包含可执行的语句。二、段寄存器的装入ASSUME 伪指令只能建立当前段与段寄存器之间的对应关系,但它不能将段寄存器赋予相应段的段基值,段寄存器的装入需要程序的方法来实现,这四个段寄存器的装入方法略有不同。1、DS和ES的装入 在程序中,使用数据传送语句来实现DS和ES的装入。例:DATA1 SEGMENT ARRAY DB 12H DATA1 ENDS DATA2 SEGMENT ARRAY1 DB 14H DUP (?)DATA2 ENDS CODE SEGMENT ASSUME CS:CODE,DS
45、:DATA1,ES:DATA2 START:MOV AX,DATA1 MOV DS,AX MOV AX,DATA2 MOV ES,AX CODE ENDS END START2、SS的装入 在段定义伪指令的组合类型项中,使用STACK参数,并在段寻址伪指 令ASSUME语句中把该段与SS相关联。例:STACK1 SEGMENT PARA STACK DB 80H DUP (?)STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START:CODE ENDS END STARTSS将自动装入STACK1段的段基值,堆栈指针SP也将自动指向堆栈栈底
46、的存储单元。(本例:(SP)=80H)2、SS的装入 如果在段定义伪指令的组合类型中未使用STACK参数,或者是在程序中 要调换到另一个堆栈,这时可以使用和DS类似的装入方法,使用数据传 送语句来实现SS的装入,但注意,除对SS赋值外,还要对SP进行赋值。例:STACK1 SEGMENT DB 80H DUP (?)TOP LABEL WORD STACK1 ENDS CODE SEGMENT ASSUME CS:CODE,SS:STACK1 START:MOV AX,STACK1 MOV SS ,AX MOV SP ,OFFSET TOP CODE ENDS END START3、CS的装入
47、 CS-段基值 IP-提供下一条将要执行的目标代码的偏移量 CPU在执行指令之前根据CS和IP的内容来从内存中提取指令,装入CS和IP。按照结束伪指令指定的地址装入CS和IP.CODE SEGMENT ASSUME CS:CODESTART:CODE ENDS END START起始地址可以省略,但一般在主程序中不被省略,在子程序中可被省略。3、CS的装入 CS-段基值 IP-提供下一条将要执行的目标代码的偏移量 CPU在执行指令之前根据CS和IP的内容来从内存中提取指令,装入CS和IP。在程序运行期间,当执行某些指令时,CPU自动修改CS和IP,使它们指向 新的代码段。例如:执行段间过程调用
48、指令CALL和段间返回指令RET;执行段间无条件转移指令JMP;响应中断及中断返回指令;执行硬件复位操作等。4.4汇编语言程序的上机过程三、程序返回DOS的两种方式。1、方式、方式1(框架(框架1)CODE SEGMENTMAIN PROC FAR ;将用户程序设置成过程;将用户程序设置成过程 ASSUME CS:CODE ,DS:DATA,SS:STACK1START:PUSH DS ;将;将PSP起始单元段地址压入堆栈起始单元段地址压入堆栈 SUB AX,AX PUSH AX ;将;将PSP起始单元偏移地址压入堆栈起始单元偏移地址压入堆栈 MOV AX,DATA MOV DS,AX RET
49、 ;返回;返回DOSMAIN ENDPCODE ENDS END START DATA SEGMENT ARRAY DB 12HDATA ENDSSTACK1 SEGMENT PARA STACK DB 80H DUP (?)STACK1 ENDS每个应用程序在装入之前,DOS系统都为程序生成一个100字节的段前缀PSP,放在程序的最前面。PSP是一个程序控制块,第一、二字节是指令INT 20H,该指令结束程序,正常返回DOS。三、程序返回DOS的两种方式。2、方式2(框架2)CODE SEGMENTMAIN PROC FAR ;将用户程序设置成过程;将用户程序设置成过程 ASSUME CS:
50、CODE ,DS:DATA,SS:STACK1START:MOV AX,DATA MOV DS,AX MOV AX,STACK1 MOV SS,AX MOV SP,OFFSET TOP MOV AH,4CH INT 21H ;返回;返回DOSMAIN ENDPCODE ENDS END START STACK1 SEGMENT DB 80H DUP (?)TOP LABEL WORD STACK1 ENDS4.4汇编语言程序的上机过程四、汇编程序的开发 1、建立汇编语言源程序 在MASM目录下使用EDIT建立一个文件名.ASM的汇编语言源文件。DATA SEGMENT ARRAY DW 400