属性修改(Attribute modifying operators)伪指令
这种运算符用来对变量、标号或某存储器操作敷的类型属性进行修改。
1.PTR运算符
这是类型属性修改运算符.使用格式为;
类型 PTR 地址表达式
其中;地址表达式是指要修改类型属性的标号、变量或用作地址指针的寄存器。这运算符的含意是指定由地址表达式确定的存储单元的类型--BYTE、WORD、DWORD、NEAR和FAR等。这种修改是临时性的,仅在有这修改运算符的语句内有效。
DA_BYTE DB 20H DUP(0)
DA_WORD DW 30H DUP(0)
┆
MOV AX,WORD PTR DA_BYTE[10]
ADD BYTE PTR DA_WORD[20],BL
INC BYTE PTR [BX]
SUB WORD PTR[SI],30H
AND AX,WORD PTR [BX][SI]
JMP FAR FIR SUB1
上面前两个指令语句主要作用是临时修改变量的类型属性。第三,四条语句,由于目的操作数是用寄存器作地址指针,汇编该指令语句时,就不知道它指的是字节单元还是字单元,因此.这两条语句必须用PTR运算符对类型加以指定。否则汇编源程序时将会产生语法错误。第5条语句不用PTR运算符也可以,因为另一操作数为AX,这样本语句一定为字操作指令。最后一条语句是指标号SUBl不在本语句的同一段内。
2.THIS运算符
运算符格式; THIS 类型
使用这个运算符的作用是,把运算符后面指定的类型属性赋给当前的存储单元,而该单元的段和偏移量属性不变。
例如:
DA_BYTE EQU THIS BYTE
DA_WORD DW 20H DUP(0)
上面第二语句是定义了20H个字单元,如要对这数组元素中某单元以字节形式访问它,则可以很方便的直接使用DA_BYTE变量名即可。DA_BYTE和DA_WORD有相同的段和偏移量属性。同样也可以有:
JUMP_FAR EQU THIS FAR
JUMP_NEAR: MOV AL, 30H
当从段内某指令来调用这程序段时,可以用标号JUMP_NEAR,如从另一代码段来调用时,则可用JUMP_FAR标号。
运算符THIS和LABEL伪指令有类似效果,上面两个含有THIS的语句可分别改为:
DA_BYTE LABEL BYTE
JUMP_FAR LABEL FAR
3.3.4 段定义(Segment_definetion)伪指令
为了实现分段结构,MASM提供了一组按段组织程序和调度、分配、使用存贮器的伪指令,他们有SEGMENT、END,ASSUME、ORG等。当程序中需要设置一个段时,就必须首先使用段定义伪指令。
1.段定义伪指令
语句格式:段名 SEGMENT [定位类型] [组合类型] [‘类别’]
...
段名 ENDS
功能及说明:SEGMENT-ENDS必须成对出现,前者为某个段定义了一个名字,即段名,并说明该段的开始;而后者说明该段的结束。其中段名是必须的,它可由用户自己确定。
定位类型表示此段的起始边界要求,以便为汇编程序实现段和程序模块的定位及连接提供必要的信息;组合类型的作用是告诉连接程序,当将本段连接及定位到绝对地址时,如何把它与其他段组合起来;类别是一个用单引号括起来的字符串,连接程序把类别相同的段依次连续存放在同一存区。
①段名
由用户自己选定,通常使用与本段用途相关的名字。如第一数据段DATAI,第二数据段DATA2,堆栈段STACKl,代码段CODE.……等等。一个段开始与结尾用的段名应一致。
②定位类型(Align--type)
这个定位类型表示对段的起始边界要求。可有四种选择:
(1)PAGE(页) 表示本段从一个页的边界开始。一页为256个字节,所以段的起始地址一定能以256整除。这样,段起始地址(段基址)的最后八位二进制数一定为‘0’(也就是以00H结尾的地址)。
(2)PARA(节):如果定位类型用户未选择,则隐含为PARA。它表示本段从一个节的边界开始。(一节为16十字节)。所以段的起始地址(即段基址)一定能以16整除。最后四位二进制数一定是‘0’。如09150H,0AB30H等。
(3)WORD(字):表示本段从一个偶字节地址开始。即段起始单元地址的最后一位二进制数一定是‘0’,即以0,2,4,6,8,A,C,E结尾。
(4)BYTE(字节):表示本段起始单元可从任一地址开始。
③组合类型(Combine--type)
这个组合类型指定段与段之间是怎样连接和定位的,并有六种可供选择:
(1)NONE:这是隐含选择。表示本段与其他段无连接关系。在装入内存时本段有自己的物理段,因而有自己的段基址。
(2)PUBLIC:在满足定位类型的前提下,本段与同名的段邻接在一起,形成一个新的逻辑段,公用一个段基址,所有偏移量调整为相对于新逻辑段的起始地址。
(3)COMMON:产生一个复盖段。在两个模块连接时,把本段与其他亦用COMMON说明的同名段置成相同的起始地址,共享相同的存储区。共享存储区的长度由同名中最大的段确定。
(4)STACK:把所有同名段连接成一个连续段,且系统自动对段寄存器SS始化在这个连续段的首址,并初始化堆栈指针SP。用户程序中至少有一个段用STACK说明,否则需要用户程序自己初始化SS和SP。
(5)AT表达式:表示本段可定位在表达式所指示的节边界上.如“AT 0930H”,那么本段从绝对地址09300H开始。
(6)MEMORY:表示本段在存储器中应定位在所有其他段的最高地址。如有多个MEMORY,则只有把第一个遇到的段当作MEMORY处理,其余的同名段均按PUBLIC说明处理。
④类别名(CLASS)
类别名必须用单引号(’)括起来。类别名可由程序设计人员自己选定任何字符串组成的名字。但是它不能再作程序中的标号、变量名或其他定义符号。在连接处理时,LINK程序把类别名相同的所有段存放在连续的存储区内(如没有指定组合类型PUBLIC,COMMON时,它们仍然是不同的段)。
以上定位类型,组合类型和类别名三个参数项是任选的。各参数项之间用空格分隔。任选时,可以只选其中一个或两个参数项,但是不能交换它们之间的顺序。
2.段指定伪指令ASSUME
语句格式:ASSUME 段寄存器:段名 [,段寄存器:段名]
功能及说明:该语句一般出现在代码段中,用来设定段寄存器与段之间的对应关系。即某一段的段址存放在相应的段寄存器中。程序中使用这条语句后,宏汇编程序就将这些段作为当前段处理。
例如:ASSUME CS:CODE,DS:DATA,SS:STACK,ES:EXTRA
该例中,设定了CS为代码段的段寄存器,DS为数据段的段寄存器,ES为附加段的段寄存器,SS为堆栈段的段寄存器。
3.ORG伪指令
语句格式:ORG 表达式
功能及说明:告诉汇编程序在它以后的程序段或数据块存放起点的偏移地址。
4.程序结束伪指令END
语句格式:END 表达式
功能及说明:该语句为汇编语言源程序的最后一个语句,用以标志整个程序的结束,即告诉汇编程序,汇编到此结束,停止汇编工作。 其中表达式的值必须是一个存储器地址,即程序中第一条可执行指令的地址。
例3.1 操作数可以是常数,或者是表达式(根据该表达式可以求得一个常数),如:
DATA_BYTE DB 10,4,10H
DATA_WORD DW 100,100H,-5
DATA_DW DD 3*20,0FFFDH
汇编程序可以在汇编期间在存储器存入数据,如下图所示。
图3.5:例3.1的汇编结果
例3.2 操作数也可以使字符串,如:
MESSAGE DB ‘HELLO’
则存储器存储情况如图所示,而DB ‘AB’和DW ‘AB’的存储情况则分别如图所示。
图3.6:例3.2的汇编结果
(1)字符串的存储 (2)DB ‘AB’ (3)DW ‘AB’
5.标题伪指令(TITLE)
TITLE 伪指令语句格式:TITLE 文本
该伪指令用于给程序指定一个标题,以便在列表文件中每一页的第一行都会显示这个标题。它的文本可以是用户任意选用的名字或字符串,但是字符个数不得超过60个.