1、 分析运算符1(SEG,OFFSET,TYPE)
语句格式:分析运算符(SEG,OFFSET,TYPE) 变量或标号
功能及说明:
① SEG 取出其后变量或标号所在段的段首址。
当运算符SEG加在一个变量名或标号的前面时,得到的运算结果是这个变量名或标号所在段的段基值。例如:
MOV AX,SEG K1
MOV BX,SEG, ARRAY
如变量K1所在段的段基值为0915H,变量ARRAY的段基值为0947H,那么上面两条指令就分别等效于:
MOV AX,0915H
MOV BX,0947H
由于任一个段的段基值是十六位二进制数,所以SEG运算符返回的数值也是十六位二进制数。
② OFFSET取出其后变量或标号的偏移首址。
当运算符OFFSET加在一个变量名或标号前面时,得到的运算结果是这个变量或标号在它段内的偏移量。
例如:
MOV SI,OFFSET KZ
设KZ在它段内的偏移量是I5H,那么这个指令就等效于:
MOV SI,15H
③ TYPE取出其后变量或标号的类型。 变量类型用字节个数表示,标号类型用NEAR和FAR对应值(见表3.3)。其中变量的类型数字正好分别是它们所占有的存储单元字节数.而标号的类型数字没有什么物理意义。
例如:
V1 DB ‘ABCDE’
V2 DW 1234H,5678H
V3 DD V2
MOV AL,TYPE V1
MOV CL,TYPE V2
MOV CH,TYPE V3
上述三条指令与下面指令完全等价:
MOV AL,01H
MOV CL,02H
MOV CH,04H
表3.4:存储器操作数类型值
存储器操作数 |
类型值 |
字节变量 |
1 |
字变量 |
2 |
双字变量 |
4 |
NEAR标号 |
-1 |
FAR标号 |
-2 |
2、 分析运算符2(LENGTH,SIZE)
语句格式:分析运算符(LENGTH,SIZE) 变量
功能及说明:
①LENGTH 取出其后变量元素的个数(注意LENGTH只对用重复运算符定义过的变量有效)。
这个运算符仅加在变量的前面,返回的值是指数组变量的元素个数。如果变量是用重复数据操作符DUP说明的,则返回外层DUP给定的值:如果没有DUP说明,则返回的值总是1。例如:
K1 DB 1OH DUP(0)
K2 DB 10H,20H,30H,40H
K3 DW 20H DUP(0,1,2 DUP(2))
K4 DB ‘ADCDEFGH’
┆
MOV AL,LENGTH K1 ;(AL):10H
MOV BL,LENGTH K2 ;(EL):1
MOV CX,LENGTH K3 ;(CX):20H
MOV DX,LENGTH K4 ;(Dx)=1
②SIZE 取出其后变量所占存贮空间的总字节数。
这个运算符仅加在变量的前面,返回数组变量所占的总字节数,且等于LENGTH和TYPE两个运算符返回值的乘积。例如对于前面例子中K1,K2,K3,K4变量,下面指令就表示出SIZE运算符的返回值:
MOV AL,SIZE K1 ;(AL)=10H
MOV BL,SIZE K2 ;(BL)=1
MOV CL,SIZE K3 ;(CL)=40H
MOV DL,SIZE K4 ;(DL)=1
三个运算符TYPE,LENGTH,SIZE对处理数组类型变量是很有用的。
3.3.3属性修改(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不在本语句的同一段内。