您的位置: 网站首页 > 程序开发 > 汇编语言与微机原理教程 > 第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、变址寄存器SIDI可以出现在[ ]内。

2BXBP可单独出现在[ ]内,也可单独与SIDI以及常数一起出现在[ ]内;但BXBP不允许同时出现在[ ]内。

3S1DI可单独出现在[ ]内,也可单独与BXBP以及常数一起出现在[ ]内;但SIDI不允许同时出现在[ ]内。

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]           ; BL29HV1的第3个字节元素)

MOV AX, V2[1]           ; AX5678HV2的第2个字元素)

MOV V3[0], AX           ; AX内容(5678H)送V31个元素

当一个表达式中出现多个操作符时,MASM将根据它们的优先级别从高到低顺序进行运算,相同优先级的操作从左到右顺序执行。表10-1给出了各种操作符的优先    级别。

10-1  操作符的优先级

优先级

   

1(最高)

( )[ ]< >LENGTHSIZEWIDTHMASK

2

. (结构引用)

3

:

4

PTRSEGOFFSETTYPETHIS

5

HIGHLOW

6

+-(单目)

7

*/MODSHLSHR

8

+-(双目)

9

EQNELTLEGTGE

10

NOT

11

AND

12

ORXOR

13(最低)

SHORT

 

10.2.1  算术运算

1*/MODSHLSHR

形式:数据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

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