数值表达式
数值表达式 由常量和算术运算符、逻辑运算符、关系运算符组合成的表达式,其结果为数值。
算术运算符 算术运算符有加( )、减(-)、乘(*)、除(/)和模除(MOD)。其中除法表示两个数相除只取商的整数部分,而模除则表示两个整数相除后取余数。在使用算数运算符构成的表达式作为操作数时,表达式的值必须满足指令对操作数的要求,否则会产生错误。
例如:219/7=31
219 MOD 7的结果为2
表3.2:算术运算符
运算符 |
语法 |
运算 |
─ * / MOD ─ SHR SHL [ ] |
表达式 ─表达式 表达式1 * 表达式2 表达式1 / 表达式2 表达式1 MOD 表达式2 表达式1 表达式2 表达式1 — 表达式2 表达式 SHR 次数 表达式 SHL 次数 表达式1[表达式2] |
正数(单项运算符) 负数(单项运算符) 乘法 除法 模除(求余数) 加法 减法 右移 左移 下标操作符 |
表中后面两个运算符是进行逻辑移位。SHR进行右移时,最左边以0填之,SHL进行左移时,最右边以0填之。移位的位数由运算符SHR/SHL右边的次数决定。如次数≥16,则结果恒为零。移位运算符与移位指令是完全不相同的两回事。移位运算符是对某一个具体的数(常数)在汇编时完成移位的,而移位指令是对一个寄存器或存储单元内容,在程序运行时执行移位的。根据它们在一条语句中出现的位置可以判断出它是移位运算符还是移位指令。例如:
NUM=11011011B
┆
MOV AX,NUM SHL 3
MOV BX,NUM SHR 2
MOV DX,NUM SHR 6
上述三条指令于下面三条指令一一对应等效:
MOV AX,11011000B
MOV BX,00110110B
ADD DX,3
表中最后一个是下标运算符,它对存取数组元素是很有用的。[]表示加法,把表达式1和表达式2相加后形成一个存储器操作数地址。但是两个存储器操作数地址(如两个变量名)不能相加。例如下面两语句是等价的:
MOV AX,DA_WORD[20H]
MOV AX,DA_WORD 20H
即源操作数是以DA_WORD为首址的第20H,21H两个字节组成的一个字。[20H]是一个数组的下标变量,也可以用寄存器来存放下标变量.例如下面5个语句是相互等价的:
MOV AX,ARRAY[BX][SI]
MOV AX,ARRAY[BX SI]
MOV AX,[ARRAY BX][SI]
MOV AX,[ARRAY SI][BX]
MOV AX,[ARRAY BX SI]
逻辑运算符 逻辑运算符包括与(AND)、或(OR)、异或(XOR)、非(NOT)和逻辑右移(SHR)、逻辑左移(SHL)。 逻辑运算符对整数常量进行按位操作,因而运算的结果仍为整数常量。
AND、OR、XOR、NOT、SHR、SHL既是逻辑运算符,也是指令助记符。作为运算符时,则必定出现在操作数域,而且在源程序汇编时进行计算的;而作为指令助记符时,则应放在助记符域,其运算是在程序执行期间才进行。
例如:设NUMBER=01101011B
NUMBER AND OFH的结果是00001011B
NUMBER XOR 11110000B结果是10011011B
NUMBER SHR 2 的结果是00011010B
关系运算符 关系运算符有六种:相等(EQ)、不相等(NE)、小于(LT)、大于(GT)、小于等于(LE)和大于等于(GE)。 关系运算符是在两个常量之间进行的,其结果只有两种情况:若关系成立则结果为0FFFFH(16为全1);否则结果为零。
表3.3:关系运算符
运算符 |
语法 |
运算 |
EQ NE LT LE GT GE |
表达式1 EQ 表达式2 表达式1 NE 表达式2 表达式1 LT 表达式2 表达式1 LE 表达式2 表达式1 GT 表达式2 表达式1 GE 表达式2 |
两个表达式相等为真 两个表达式不相等为真 表达式1表<达式2为真 表达式1=<表达式2为真 表达式1>表达式2为真 表达式1>=表达式2为真 |
例如:设NUM1=50
则表达式“NUM1 NE 100”的值为0FFFFH
而表达式“NUM1 EQ 100”的值为0