表达式由数据和运算符组成,汇编语句在表达式中允许使用的数据有常数和标识符,并且限制表达式在整数范围内使用。
汇编语言表达式运算法则同高级语言一样,即:
· 首先计算高优先级的运算符。
· 相同优先级的运算符按从左到右的顺序计算。
· 括号可以改变运算符的优先级,即应最先考虑括号中的运算符。
汇编语言常用的运算符可分为算术运算符、逻辑运算符及关系运算符。我们按其优先级由高到低的顺序讲解,同级的列为一项。
在表达式中可使用圆括号( )运算符来改变运算次序,圆括号( )中的优先级最高。圆括号可以嵌套使用,内层的优先级高于外层。
表达式中可使用方括号[ ]运算符来表达地址或者数组变量(多重变量)的下标值。
例如,用方括号表达式表示地址:
MOV BX, 3200H
MOV AX, [BX] ; AX←[BX], RP[3200H]单元中的字送AX
MOV SI, 1000H
MOV AX, [BX+SI] ; AX←[BX+SI] ,即4200H处的字送AX
MOV AX, VAR[BX+SI] ; AX←[BX+SI+OFFSET VAR] , VAR为已定义的变量名
MOV BUF[SI], BX ; [SI+OFFSET BUF]←BX, BUF为已定义的变量名
MASM对方括号的地址表达式有如下的规定。
(1)只有基址寄存器BX、基址指针BP、变址寄存器SI和DI可以出现在[ ]内。
(2)BX或BP可单独出现在[ ]内,也可单独与SI或DI以及常数一起出现在[ ]内;但BX和BP不允许同时出现在[ ]内。
(3)S1或DI可单独出现在[ ]内,也可单独与BX或BP以及常数一起出现在[ ]内;但SI和DI不允许同时出现在[ ]内。
(4)一个[ ]内含基址和变址寄存器时,它们只能做加法运算;相加的基址和变址寄存器可以写在两个相邻的[ ]内。
(5)当[ ]内包含基址指针BP时,约定的段基址由堆栈段寄存器SS提供,否则均隐含使用数据段寄存器DS。
(6)相加的常数可以写在[ ]之外。
(7)方括号内还可以是表达式,其值表示数组变量的下标。
(8)对32位段情况类似,偏移地址可扩展为32位,相应表示地址的寄存器也可扩展为32位寄存器,变址寄存器可以乘比例系数。
例如,方括号表达式表示数组变量下标值举例如下:
V1 DB 82H, 63H, 29H, 46H
V2 DW 1234H, 5678H, 9A0BH
V3 DW 5 DUP(?)
MOV BL, V1[2] ; BL←29H(V1的第3个字节元素)
MOV AX, V2[1] ; AX←5678H(V2的第2个字元素)
MOV V3[0], AX ; AX内容(5678H)送V3第1个元素
当一个表达式中出现多个操作符时,MASM将根据它们的优先级别从高到低顺序进行运算,相同优先级的操作从左到右顺序执行。表10-1给出了各种操作符的优先 级别。
表10-1 操作符的优先级
优先级 |
操 作 符 |
1(最高) |
( )、[ ]、< >、LENGTH、SIZE、WIDTH、MASK |
2 |
. (结构引用) |
3 |
: |
4 |
PTR、SEG、OFFSET、TYPE、THIS |
5 |
HIGH、LOW |
6 |
+、-(单目) |
7 |
*、/、MOD、SHL、SHR |
8 |
+、-(双目) |
9 |
EQ、NE、LT、LE、GT、GE |
10 |
NOT |
11 |
AND |
12 |
OR、XOR |
13(最低) |
SHORT |
(1)*、/、MOD、SHL、SHR。
① 形式:数据1*数据2或数据1/数据2。
*与/ 是一般乘除法。
② 形式:数据1 MOD数据2。
其值为数据1/数据2的余数。
③ 形式:数据1 SHL数据2。
其值为“数据1”左移“数据2”位的值。
④ 形式:数据1 SHR数据2。
其值为“数据1”右移“数据2”位的值。
(2)+、-。
+、-为一般意义上的加、减法。
算术运算符应用于常数,结果是一个整数。
当算术运算符应用于存储器即地址数据时,其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才是有效的。
例如,两个存储器地址的乘积没有意义。因为我们不知道乘完以后的地址是在哪一个段,所以,这是一种不允许的操作。
在同一个段的两个存储器地址的差是这两个存储单元之间的距离,这是有意义的。对于存储器地址操作数的另一个有意义的表达式是加或减一个常数。
如果关系表达式的条件满足,其值为“1”,否则其值为“0”。
(1)形式:数据1 EQ数据2。
判断数据1是否等于数据2。
(2)形式:数据1 NE数据2。
判断数据1是否不等于数据2。
(3)形式:数据1 LT数据2。
判断数据1是否小于数据2。
(4)形式:数据1 LE数据2。
判断数据1是否小于等于数据2。
(5)形式:数据1 GT数据2。
判断数据1是否大于数据2。
(6)形式:数据1 GE数据2。
判断数据1是否大于等于数据2。
关系运算符的两个数据或者都是常数,或者是同一段的存储器地址。
(1)形式:NOT数据。
表示把数据取反。
(2)形式:数据1 AND数据2。
表示数据1与数据2进行逻辑与运算。
(3)形式:数据1 OR数据2。
表示数据1与数据2进行逻辑或运算。
(4)形式:数据1 XOR数据2。
表示数据1与数据2进行逻辑异或运算。
逻辑运算符的数据只能是常数。
汇编语言的表达式不能构成单独语句,只能是语句的一部分,例如:
MOV AX,buf+2
ADD AL,68H AND OFH
JMP again+3
MOV BL,vb LE va
另外必须指出的是,语句中对表达式求值是在对源程序进行汇编链接时完成的。也就是说,表达式中各标识符的值是在汇编或链接时就应该确定的。