2015年计算机三级考试PC技术知识要点(16)
发布时间:2010/12/12 18:38:52 来源:城市学习网 编辑:ziteng
九、80X86宏汇编语言的伪指令语
(一)基本宏汇编语言的伪指令语句
8086/8088宏汇编有近60条伪指令,其大体分类如下表所示。
表8086/8088伪指令分类
类别 伪指令 类别 伪指令
符号定义伪操作 EQU,=,LABEL
宏处理伪操作 MACRO,ENDM,EXITM LOCAL,REPT,IRPC,IRP,PURGE
变量定义伪操作 DB,DW,DD,DQ,RECORD,STRUC 条件伪操作 IF,ENDIF,IF1,IF2,IFNB,IFE,IFDIF,IFNDFE IFIDN,ELSE
段定义伪操作 SEGMENT,
ENDS GROUP,
ASSUME,ORG
过程定义伪操作 PROC,ENDP 列表伪操作 PAGE,TITLE, SUBTTL,LIST, XLIST,%OUT
模块定义与通信 EXTRN,PUBLIC
NAME,END 其他 COMMENT,RADIX INCLUDE EVEN
1.符号定义
符号定义伪指令可用于为表达式赋予一个符号名,表达式可以是常量、变量、标号、指令语句和字符等。在程序中,任何需要这种表达式的地方都可以用被赋予的符号名来代替它。常用的符号定义语句有等值语句(EQU)和等号语句(“=”)。
(1)等值语句
格式:符号名 EQU 表达式
功能:用符号名代替右边的表达式的值。
说明:表达式可以是一个值、新符号名、可执行的命令或表达式的值。
注意:在同一个源程序中,EQU语句定义的符号不能再赋予不同的值,即不能再重新定义。
(2)等号语句
格式:符号名=表达式
功能:等号语句的功能和EQU语句类似,不同之处是它允许对符号名再定义。 [NextPage] 2.变量定义
变量定义语句使用伪指令DB、DW、DD、DF、DQ和DT。格式:变量名 {DB|DW|DD|DF|DQ|DT}表达式
功能:在内存中分配一块以变量名为名字的一个或多个字节/字/双字/长字/4字/10字的数据储区,并填入由伪指令给出的数据。说明:
①变量名是可选择的,它表示定义的一块内存单元数据区的名字。
②花括号{}中的项是可选择的伪指令,每次定义只能选择其中一种。各伪指令的意义为:
●DB 定义字节数据存储区
●DW 定义字数据存储区
●DD 定义双节数据存储区
●DF 定义长字数据存储区
●DQ 定义4字数据存储区
●DT 定义10字压缩BCD码数据存储区
③表达式是伪指令的操作
数,它可以是数值表达式、地址表达式、ASCII码表达式、?表达式或n DUP表达式。说明如下:
●数值表达式
数据在存储区中存放时,左边的数据项占较小地址,右边的数据项占较大的地址;对于非DB定义的数据,高位字节占据较大地址,低位字节占据较小地址。
●地址表达式
地址表达式的运算结果是一个地址,因而只能使用伪指令DW和DD。这时,存储单元中存放的是存储器的地址值。如果使用DW,则存放的是段内地址偏移量;如果使用DD,则存放段地址和地址偏移量。
●ASCII码字符串表达式
使用伪指令DB可以定义用单引号括起来的字符串,它为字符串的每个字符分配一个存储单元,并依字符串从左到右的顺序,将字符的ASCII码按地址递增顺序放在内存中
●?表达式
表达式?号时,表示符号名无确定值。汇编程序遇到?号时,它仍然为数据项分配存储单元,但不对它初始化。
●n DUP(?)
格式:数值表达式 DUP 项或项表
数值表达式的值表示重复的次数,其各项必须预先定义。项或项表表示重复内容,可以是?、数值、数值表达式、字符或重复子句。项表中的各项用逗号隔开。
当重复子句为DB、DW、DD、DQ和惟一操作数且项为?时,将不初始化数据区,该数据氏的原存信息保持不变。当重复句是惟一操作数时,定义的变量具有LENGTH和SIZE属性。
3.标号定义伪指令
格式:符号名 LABEL 类型
功能:将紧跟在本伪指令语句后的标号、操作码、过程或变量建立新的符号名,并刷新其类型属性。对标号、操作码或过程,其类型为NEAR、FAR;对变量,其类型为BYTE、WORD、DWOBD、FWORD、QWORD或TBYTE。
说明:LABEL伪指令提供了另一种定义标号或变量名的方法,但它并不为符号名分配存储空间 。
4.段定义语句
8086/8088的存储器是分段的,因此使用段定义语句来组织程序和利用存储器。常用的段定义伪
指令有:SEGMENT、ENDS、ASSUME、ORG、PAGE、PUBLIC、TITLE、SUBTTL等。
(1)SEGMENT和ENDS
SEGMENT和ENDS语句将汇编语言源程序分成段。
格式:
段名 SEGMENT[定位类型][组合类型][‘类别’]
┆
语句段
┇
段名 ENDS
说明:段名是由自己指定的为该段起的名字。定位类型、组合类型是给段名的属性,用来指出汇编程序为该段分配的存储器的起始地址;类别名则指出段的类别。用方括号括起来的项可以缺省。 [NextPage] ①定位类型
用于指定该段地址中的5种可供选择段起点的边界类型,如下表所示。
定位类型
定位类型 含 义
BYTE(字节) 段的起始地址可以任意
WORD(字)
段的起始地址必须为偶数,即该地址的最低二进制位应为0
DWORD(双字) 段的起始地址必须为4的倍数,即该地址的最后2位二进制位应为0,通常总是把DWORD用于80386的32位段中
PARA(节) 段的起始地址必须为16的倍数,即该地址的最后4位二进制位应为0
PAGE(页) 段的起始地址必须为256的倍数,即该地址的最后8位二进制位应为0
这个类型可以为标号或变量赋予绝对地址,以便程序以标号或变量的形式存取这些存储器单元的内容。通常情况下,在AT类型的段中不定义指令或数据,只是说明一个地址结构。②组合类型
用来告诉连接程序LINK,本段与其他模块中同名段的组合连接关系。共有下表所示的5种可供选择的组合类型。如果此属性缺省,则表示该段是独立的,不与其他同名段发生联系,并有自己的段起始地址。
组合类型
组合类型 含 义
PUBLIC 链接程序LINK将不同模块中具有该类型且段名相同的段连接到同一个物理存储段中,使它们公用一个段地址
STACK 与PUBLIC的处理方式一样,只是连接后的段为堆栈段,链接程序LINK在链接过程中自动将新段的段地址送到堆栈段寄存器SS,将新段的长度送到堆栈指针寄存器SP。如果在定义堆栈时没有将其说明为STACK类型,在这种情况下就需要在程序中用指令给堆栈段寄存器SS、堆栈指针寄存器SP置值,这时链接程序LINK会给出一个警告信息
COMMON 产生一个覆盖段。链接程序LINK为该类型的同名段指定相同的段地址。段的长度取决于最长的COMMON段的长度。段的内容为所连接的最后一个模块中COMMON段的内容及其没有被覆盖到的前面COMMON段的部分内容
MEMORY 链接程序LINK不单独区分MEMORY类型,它把MEMORY与PUBLIC类型同等对特。MASM程序允许使用它,主要是为了与其他支持Intel MEMOˉRY类型的连接程序兼容
AT表达式 链接程序LINK将具有AT类型的段装在表达式值所指定的段地址边界上
③类别
用于控制段的存放次序。它可以是任何合法的名称,但必须用单引号括起来。连接程序LINK只使同类别的段发生关系,并将它们存放在连续的存储空间中。若“类别”选择项缺省,则表明该段类别为空。
(2)ASSUME语句
格式:ASSUME 段寄存器:段名[,段寄存器:段名,]
功能:告诉汇编程序,程序的段结构和在各种指令执行时访问哪一段。段寄存器只能是CS、SS、DS、ES中的一个,段名是由伪指令SEGMENT/ENDS语句中定义的段名。注意:
●代码段寄存器CS只能用于有程序的段。代码段寄存器CS所对应的段名必须在该语句之前有定义,因此,ASSUME语句一般都设置于代码段内,放在段定义语句之后。
●堆栈段寄存器SS只能与堆栈段相对应。
●ASSUME语句是说明性语句,除主程序的代码段及最后一个椎栈段外,其余段寄存器的初值均由用户在程序中设置。
(3)组定义伪指令 GROUP
格式:组名GROUP 段名[,段名,……]
功能:将GROUP定义符后指定的所有段分配在一个64KB的物理存储器段中,并赋予该段一个名字———组名。说明:
●组名是用户自己定义的名字,是指出组的起始地址的一种符号。这个符号必须是惟一的,不能与任何标号、段名及变量名等同名。
●段名是用SEGMENT语句定义的或者由SEG运算符得到的段名。
●组定义语句不影响各段的次序,因此组内各段不一定要连续存放,但它们都必须包含在64KB物理存储器段中。
●当源程序结构需要多个逻辑段时,使用该语句可节省段寄存器。
●实际应用中最好是让代码段为一组,堆栈段为一组,数据段为一组或两组,但组中各段所占用的内存储器的总量不超过64KB。
(4)指定地址伪指令 ORG格式:ORG 表达式
ORG $+偏移地址
功能:指定该语句之后程序段或数据块的起始地址的偏移量,即语句表达式的值作为起始地址,连续存放程序和数据,直到下一个ORG语句为止。
5.过程定义伪指令
在程序设计中,常把具有一定功能的程序段设计成为一个过程。过程是程序的一部分,它可以被程序调用。每次可调用一个过程,当过程中的指令执行完后,控制返回调用它的地方。过程定义语句的格式:
过程名 PROC [NEAR或FAR]
┇
(语句)
┇ RET
过程名 ENDP说明:
●过程名是给过程起的名字,调用过程时,过程名起标号的作用。
●伪指令PROC和ENDP必须成对出现,限定一个过程,并说明该过程是NEAR过程还是FAR过程。
●在宏汇编中,过程调用和从过程返回使用CALL和RET。
●有两种调用方式:段内调用和交*调用。如果以用段内CALL指令调用过程则必须用段内RET指令返回,这样的过程是NEAR过程,用段交*CALL指令调用过程,则必须做段交*RET指令返回,这样的过程是FAR过程。
●在一个过程中可以有多于一个的RET指令,并且过程中最后一条指令可以不是RET,但必须是一条转移过程中某处的转移指令。
●主程序和子程序都可以作为一个过程。
6.结束语句
格式:END 表达式
功能:结束整个源程序。
说明:表达式必须产生一个存储器地址。这个地址是当程序执行时,程序第一条要执行指令的地址。