您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第10章 宏汇编语言 > 【10.2 宏汇编语言的表达式】

10.2 宏汇编语言的表达式

 

10.2  宏汇编语言的表达式

表达式由数据和运算符组成,汇编语句在表达式中允许使用的数据有常数和标识符,并且限制表达式在整数范围内使用。

汇编语言表达式运算法则同高级语言一样,即:

·    首先计算高优先级的运算符。

·    相同优先级的运算符按从左到右的顺序计算。

·    括号可以改变运算符的优先级,即应最先考虑括号中的运算符。

汇编语言常用的运算符可分为算术运算符、逻辑运算符及关系运算符。我们按其优先级由高到低的顺序讲解,同级的列为一项。

在表达式中可使用圆括号( )运算符来改变运算次序,圆括号( )中的优先级最高。圆括号可以嵌套使用,内层的优先级高于外层。

表达式中可使用方括号[ ]运算符来表达地址或者数组变量(多重变量)的下标值。

例如,用方括号表达式表示地址:

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

 

10.2.1  算术运算

(1)*、/、MOD、SHL、SHR。

① 形式:数据1*数据2或数据1/数据2。

*与/ 是一般乘除法。

② 形式:数据1 MOD数据2。

其值为数据1/数据2的余数。

③ 形式:数据1 SHL数据2。

其值为“数据1”左移“数据2”位的值。

④ 形式:数据1 SHR数据2。

其值为“数据1”右移“数据2”位的值。

(2)+、-。

+、-为一般意义上的加、减法。

算术运算符应用于常数,结果是一个整数。

当算术运算符应用于存储器即地址数据时,其规则就更加严格:只有当结果有明确的、有意义的物理解释时,这些运算才是有效的。

例如,两个存储器地址的乘积没有意义。因为我们不知道乘完以后的地址是在哪一个段,所以,这是一种不允许的操作。

在同一个段的两个存储器地址的差是这两个存储单元之间的距离,这是有意义的。对于存储器地址操作数的另一个有意义的表达式是加或减一个常数。

10.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。

关系运算符的两个数据或者都是常数,或者是同一段的存储器地址。

10.2.3  逻辑运算

(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

另外必须指出的是,语句中对表达式求值是在对源程序进行汇编链接时完成的。也就是说,表达式中各标识符的值是在汇编或链接时就应该确定的。