2015年计算机三级考试PC技术知识要点(17)
发布时间:2010/12/12 18:40:06 来源:城市学习网 编辑:ziteng
7.列表伪指令语句
为使源程序的.LST文件满足用户的某些要求,宏汇编专门设置了一组列表伪指令。
(1)格式控制伪指令
格式控制伪指令有PAGE,TITLE和SUBTTL。①PAGE
一般为程序的第一语句,它指定汇编程序所产生的列表文件每页的行数和每行的字符数。格式:PAGE 参数1,参数2
说明:参数1表示每页行数,参数2表示每行字符数。②TITLE
用来为程序指定一标题,以后的列表文件会在每页第一行打印这个标题。格式:TITLE 正文③SUBTTL
用于为程序指定一个小标题,打印在每一页的标题之后。格式:SUBTTL 正文
(2)列表控制伪指令
列表控制伪指令很多,主要有:
①.LALL,.SALL和.XALL这是针对宏指令的伪指令。格式:.LALL/.SALL/.XALL说明:
●.LALL 伪指令用于对所有宏汇编列出完整的文本。
●.SALL 伪指令用于删除宏指令所产生的所有列表。
●.XALL 只将宏扩展中产生目的代码的源程序列表。
②.LIST和.XLIST格式:.LIST/.XLIST说明:
●.LIST 是默认伪指令,对所有源程序进行列表直到遇到.XLIST伪指令止。
●.XLST 对所有源程序不产生列表直到遇到.LIST伪指令为止。上述伪指令只用于汇编产生.LST文件时起作用。
8.模块定义伪指令和通信伪指令
在程序设计中,可以将一个复杂的程序分成若干个程序模块,每个模块在物理上和逻辑上都是相对独立的,可对它们分别进行编写和调试。即对所有模块汇编完后,再由链接装配程序LINK连接成一个完整的可执行程序。模块定义和通信指令则是实现模块划分、命名及不同模块中数据共享等的说明和记号。
(1)模块定义语句
模块定义使用NAME和ENDD两条伪指令。语句格式:
NAME 模块名 (语句)ENDD 表达式说明:
●模块名是任选的为本次汇编产生的目的模块所起的名字,是NAME的操作数。
●ENDD表示源程序到此结束。同时,在主模块中ENDD后允许有表达式,其他它模块只书写END。
(2)PUBLIC伪指令
该伪指令定义可供其他模块引用的符号。格式:PUBLIC 符号表
说明:符号表的各项用逗号隔开,符号可以是符号常量、变量、标号或过程名。
(3)EXTRN伪指令
EXTRN伪指令的功能是用于声明当前模块使用的哪些标识符在其他模块内定义。
格式:EXTRN 符号:类型[,符号:类型,……]
说明:符号可以是符号常量、变量、标号或过程名;类型可以是BYTE、WORD、DWORD、NEAR、FAR和ABS。各项由逗号隔开。
(二)高级汇编伪指令语句1.结构和记录
(1)结构
①结构类型数据定义伪指令
80x86宏汇编使用伪指令STRUC和ENDS建立一种结构类型的数据,然后通过结构类型数据的预置,便可方便地访问结构中的各数据项,而不需要对操作数地址表达式进行繁锁的计算。 结构类型数据定义的格式: 结构名 STRUC
┆
字段名 数据定义伪指令定义符 表达式
┆
结构名 ENDS
说明:结构类型数据是用STRUC和ENDS括起来的数据定义语句序列,这时数据定义语句中的符号称为字段名。注意:
●定义结构时,STRUC和ENDS必须成对出现,缺一不可。
●结构名是为结构起的名字,是任意选定的。
●同时在同一结构定义中,字段名不得重名。
②结构变量说明与赋初值
结构类型数据的定义只是告诉汇编程序已存在这样一种形式的变量,还必须对结构进行存储分配和预置后才能真正产生结构数据的变量。结构类型数据预置的格式:
结构变量名 结构名 <字段值表>说明:
●DATAMAX和DATATXN是结构变量名。
●结构变量名是任意的,由程序员自行设定。
●结构变量名与具体的存储空间和数据相联系,在程序中可直接引用。
●字段值表用来给结构变量赋初值,字段值必须用尖括号括起来,其排列顺序和类型应该与结构定义时的各字段相一致,各字段值之间用逗号隔开。如果采用定义结构时的初值,则仅写一个逗号;若所有字段采用定义时的初值,则仅写一对尖括号。
注意:并不是所有的字段都可以重新赋初值,只有一项数据的字段可重新赋值。在程序中引用结构变量,可直接写结构变量名:引用结构变量的某一字段时,要采用下述格式:结构变量名.字段名
(2)记录
记录是一种处理按位计算信息的数据类型。记录定义的格式:
记录名 RECORD 字段名:宽度[=表达式][,……]说明:
●记录名和字段名必须具有惟一性;
●宽度表示字段所占的位数(1~16位),如果各字段的宽度和大于8位,那么汇编程序按字处理,否则按字节处理。若总值数少于8位或16位,则所有字段都右对齐到字或字节的最低有效位置。表达式赋给相应字段的初值,是可选择的。
●记录的各字段宽度之和不得大于16位。记录也必须经过预置才能产生记录类型数据变量,才能真正占有内存。记录预置的格式: [NextPage] 记录变量名 记录名 <字段值表>
说明:字段值表是赋给各字段的初值,必须用尖括号括起来,表中各项间用逗号分隔,各项顺序应与记录定义时相一致。若某字段采用时的初值,则该字段用逗号表示;若各字段均采用定义时的初值,则仅用尖括号。
对记录进行操作的专用操作符有3个,即:记录字段名,WIDTH和MASK。①记录字段名
这个操作符无操作数,可直接引用,它的结果是一个立即数,表示该字段的最低位移到所在记录最右边(0位)所需的移位次数。②WIDTH
返回记录或记录某字段的宽度。
格式:WIDTH 记录名或记录字段名③MASK
格式:MASK 记录字段名
MASK的结果是一个8位或16位二进制数,这个二进制数中相应于该字段的各位均是1,其余各位均是0。
记录操作符可以与运算符NOT、OR、AND、SHL、SHR配合使用。
关于记录、记录字段及记录变量的调用,由于记录有自己专用的操作符,故利用这些操作符可对记录及其字段进行操作。
2.宏指令
在汇编语言程序中,有的程序段有时要多次使用,为了使在源程序中不重复书写这个程序段,可以用一条宏指令来代替,在汇编时由汇编程序产生所需的代码。宏指令的使用过程是宏定义、宏调用和宏扩展。
(1)宏定义
宏指令的定义格式:
宏指令名 MACRO[形式参数]┆(宏体) ENDM说明:
●宏指令名是给宏指令起的名字,MACRO是宏定义的定义符,ENDM是宏定义的结束符,两者必须成对出现。
●MACRO和ENDM之间的指令序列称为宏体,即用宏指令要代替的程序段。宏指令具有接受参数的能力,宏体中使用的形式参数必须在MACRO语句中出现。当有两个以上参数时,需用逗号隔开。
●在宏指令被调用时,这些参数被给出的一些名字或数值所取代。
(2)宏调用经过宏定义后,在源程序中的任何位置可以直接使用宏指令名,实现宏指令的调用,称为宏调用。宏调用的结果是将汇编程序翻译成该宏定义的程序段,而产生的目标代码拷贝到调用点。宏调用的格式:
宏调令名(参数,……)
(3)宏扩展
在汇编宏指令时,宏汇编程序将宏体的指令插入到宏指令所在的位置上,并用实在参数代替形式参数,同时在插入的每一条指令前加一个“+”号,这个过程称为宏扩展。
(4)常用宏指令
80x86宏汇编中常用宏指令的格式及功能如下表所示。
常用宏指令
名称 格式 功能
MACRO 宏定义伪指令
PURGE PURGE宏指令名[…]
其功能是取消宏指令名的定义。一个PURGE指令可同时取消多个宏定义
REPT REPT<表达式> ┆(指令体)ENDM 其功能是重复执行指令体所包含的话句,重复次数由表达式的值确定
IRP IRP形式参量,(参数表) …(指令体)ENDM 重复执行指令体内所包含的语句。重复次数由参数表中参数的个数决定。参数表中参数必须用<>括起来,参数间用逗号分隔。每重复一次,依次用参数表中的参数代替形式参数
IRPC IRPC形式参数,字符串 ┆(指令体)ENDM 功能与IRP相同,只是用字符串代替IRP中指令中的参数表 [NextPage] 3.重复汇编伪指令
这是重复汇编某一语句序列的伪指令,它可以出现在宏定义中,也可以单独出现在源程序中,注意,重复汇编是在程序汇编期间对某些语句进行重复汇编,而不是在程序运行期执行重复操作。重复汇编伪指令有以下3种形式:
(1)格式1
REPT<表达式>
┆ ;需重复的语句组
ENDM
这种宏指令用于重复块次数确定的伪操作,它表示按表达式所指定的次数,重复REPT和ENDM之间的语句块,表达式的取值范围是0~65535。
(2)格式2
IRP<形式参数>,<实在参数1,实在参数2,……>
┆ ;需重复的语句组
ENDM
这种宏指令用于带立即数的重复伪操作。实在参数是用户指定的立即数,它的个数就是重复次数,每重复一次,就用一个实在参数替代形式参数。
(3)格式3
IRPC形式参数,<字符串>
┆ ;需重复的语句组
ENDM
这种宏指令用于带字符串的重复伪操作,重复次数由字符串的个数确定,每次重复,依次用字符串中的一个字符替代形式参数,直到字符替代完毕为止。
4.条件汇编伪指令
80x86宏汇编提供了条件汇编功能和条件汇编伪指令,如下表所示。
条件汇编伪指令
IFNB<参量>
格 式 功 能
IF(表达式) 若表达式值不为0,则条件为真
IFE(表达式) 若条件表达式值为0,则条件为真
IF1 当汇编程序处在对源程序进行第一次扫描过程时,条件为真
IF2 当汇编程序处在对源程序进行第二次扫描过程时,条件为真
IFDEF<符号> 若指定符号已被定义或由EXTRN指令进行外部说明,则条件为真
IFNDEF<符号> 若指定符号未定义或未由EXTRN指令进行外部说明,则条件为真
IFB<参量> 若参量为空格,则条件为真
B<参量> 参量不是空格时,条件为真
IFIDN<参量1>,<参量2> 当参量1的串与参量2的串相同时,条件为真
IFIDF<参量1>,<参量2> 当参量1的串与参量2的串不同时,条件为真
各种条件汇编语句用法的一般格式为:
IF ×× ARGUMENT
<语句体1>
[ELSE] (任选)
<语句体2>
ENDIF
其中,IF××是条件伪指令,××用于区别不同种类的条件伪指令。 [NextPage] (三)伪指令语句的增强与扩充
1.简化段定义伪指令
(1)简化段定义伪指令:完整段定义伪指令和简化段定义伪指令。在MASM5.0以上的汇编语言版本中,既可以使用完整段定义伪指令,又可使用简化段定义伪指令;在低于MASM5.0的版本中,只能使用完整段定义伪指。
简化段定义伪指令如下表所示。
简化段定义伪指令
段语句名 伪指令格式 功 能
代码段语句 .CODE[名字] 定义一个代码段,如果有多个代码段,要用名字加以区分
堆栈段语句 .STACK[长度] 定义一个堆栈段,并形成堆栈段寄存器SS和堆栈指针SP的初值。(SP)=长度,如果省略长度,则(SP)=1024
初始化近程数据段语句 .DATA 定义一个近程数据段,当用来与高级语言程序连接时,其数据空间要赋初值
非初始化近程数据段句 .DATA? 定义一个近程数据段,当用来与高级语言程序连接时,其数据空间只能用“?”定义,表示不赋初值
常数段语句 .CONST 定义一个常数段,该段是近程的,用来与高级语言程序连接, 段中数据不能改变
初始化远程数据段语句 .FARDARA?[名字] 定义一个远程数据段,且其数据语句的数据应赋初值,用来与高级语言程序连接
非初始化远程数据段句 .FARDARA[名字] 定义一个远程数据段,但其数据空间不赋初值,只能用“?”定义数据,用来与高级语言程序连接
(2)定义内存模式伪指令(MODEL)
在使用简化段定义伪指令时,必须事先说明用户使用的内存模式。格式:MODEL 模式类型[,高级语言]功能:指定数据和代码允许使用的长度。
●程序中凡数据或代码的长度不大于64KB时为近程,否则为远程。近程的数据通常定义在一个段中,对应于物理存储器中的一个段,只要程序一开始将其段值设置在DS中,以后数据的访问只改变偏移值,而不必改变其段值。
通常总是将定义内存模式伪指令语句放在用户程序中其他简化定义伪指令语句之前。可供选择的内存模式有5类,如下表所示。当独立的汇编语言源程序不与高级语言程序连接时,多数情况下只用小模式。
内存模式的类型
内存模式 说 明
Small 小模式,程序中的数据放在64KB的数据段内,代码放在64KB的代码段中,为近程
Medium 中模式,数据为近程,允许代码为远程
Compact 压缩模式,代码为近程,允许数据为远程
Large 大模式,允许数据和代码为远程,但一个数据段不能大于64KB
Huge 巨型模式,允许数据和代码为远程,且数据语句所用存储空间可以大于64KB
2.方式选择伪指令
80x86汇编语言是在8086/8088汇编语言的基础上逐步发展并向上兼容的,因此在对源程序进行汇编时,汇编程序首先要区分当前的源程序是针对80x86系列的哪种微处理器而执行的,为此提供了微处理器方式选择伪指令。又因为MASM5.0中对应每种微处理机的指令系统都有一个汇编执行语句集合,简称指令集,因此微处理器方式选择伪指令,实质上也就是指令集选择伪指令。方式选择伪指令的格式和功能下表所示。
方式选择伪指令的格式和功能
伪指令格式
功 能
.8086
这是一种默认方式,它告诉汇编程序只接受8086/8088指令
.286/.286C 它告诉汇编程序只接受8086/8088指令以及80286非保护方式下的指令,用.8086可以删除该伪指令
.286P 靠诉汇编程序接受8086/8088以及80286的所有指令(不仅包括保护方式下的指令,也包括非保护方式下的指令),通常只有系统设计人员才使用该伪指令,可以使用.8086伪指令删除
.386/.386C 告诉汇编程序接受8086/8088指令,以及80286/80386非保护方式下的指令。在这种方式下,将禁止所有保护方式下的指令出现,否则将出错
.386P 除具有.386/.386C功能外,还允许汇编保护方式下的80286/80386指令,通常只有系统设计人员才使用该伪指令。可以使用.8086伪指令删除
.8087 选用8087指令集,并指定实数的二进制码为IEEE格式
.287 选用80287指令集,并指定实数的二进制码为IEEE格式
.387 选用80387指令集,并指定实数的二进制码为IEEE格式
.486/.486C 允许汇编非保护方式下的80486指令。MASM6.0可以使用
.486P 允许汇编80486的全部指令。MASM6.0可以使用
上述伪指令语句一般放在源程序的开头