(1) 算术操作符
算术操作符可以用于数字表达式或地址表达式中,但当它用于地址表达式时,只有当其结果有明确的物理意义时才是有效的结果。例如两个地址相乘或相除是无意义的。在地址表达式中,可以使用
+ 或 - ,但也必须注意其物理意义。
例如把两个不同段的地址相加也是无意义的。经常使用的是地址 ± 数字量,它是有意义的。例如SUM +1是指SUM字节单元的下一个字节单元的地址(注意:不是指SUM单元的内容加1),而SUM-1则是指SUM字节单元的前一个字节单元的地址。
例: 如果要求把首地址为BLOCK的字数组的第6个字传送到DX寄存器,可用指令如下:
MOV DX, BLOCK+ (6-1) * 2
例: 如数组ARRAY定义如下,写出把数组长度(字数)存入CX寄存器的指令。
ARRAY DW 1, 2, 3, 4, 5, 6, 7
ARYEND DW ?
其中ARYEND是为计算数组长度而建立的符号地址,所需指令如下:
MOV CX, (ARYEND-ARRAY)/2
汇编程序在汇编期间将计算出表达式的值而形成指令:
MOV CX, 7
(2) 逻辑操作符
例:
OUT PORT_VAL AND 0FEH, AL
上例中PORT_VAL为端口号,OUT指令中的表达式说明只为偶数号端口输出数据。
例:
AND DX, PORT_VAL AND 0FEH
上例在汇编时由汇编程序对指令中的表达式进行计算得到一个端口号,而在程序运行时,该指令的执行是把DX寄存器的内容与汇编程序计算得到的端口号进行"与"操作,结果保存在DX寄存器中。
注意:表达式中的AND是运算符,汇编时由汇编程序计算出一个值;而AND指令是在运行时由CPU执行。
(3) 关系操作符
例如:
MOV BX,((PORT_VAL LT 5) AND 20) OR ((PORT_VAL GE 5) AND 30)
则当PORT_VAL < 5时,汇编结果应该是:
MOV BX, 20
否则,汇编结果应该是:
MOV BX, 30
(4) 数值回送操作符
· TYPE
举例:
ARRAY DW 1, 2, 3
则对于指令ADD SI, TYPE ARRAY
汇编程序将其形成为:
ADD SI, 2
· LENGTH
举例1:
FEES DW 100 DUP (0)
对于指令MOV CX, LENGTH FEES
汇编程序将使其形成为:
MOV CX, 100
举例2:
ARRAY DW 1, 2, 3
对于指令MOV CX, LENGTH ARRAY
汇编程序将使其形成为:
MOV CX, 1
举例3:
TABLE DB 'ABCD'
对于指令MOV CX, LENGTH TABLE
汇编程序将使其形成为:
MOV CX, 1
· SIZE
例如:
MOV CX, SIZE FEES
将形成为 MOV CX, 200
又例如:
MOV CX, SIZE ARRAY
将形成为 MOV CX, 2
又例如:
MOV CX, SIZE TABLE
将形成为 MOV CX, 1。
· OFFSET
举例:
MOV BX, OFFSET OPER_ONE
汇编程序将OPER_ONE的偏移地址作为立即数回送给指令,而在执行时则将该偏移地址装入BX寄存器中。所以这条指令的功能与指令
LEA BX, OPER_ONE
是等价的。
· SEG
举例:如果DATA_SEG是从存储器的05000H地址开始的一个数据段的段名,OPER1是该段中的一个变量名,则
MOV BX, SEG OPER1
将把0500H作为立即数插入指令。实际上,由于段地址是由连接程序分配的,所以该立即数是连接时插入的。执行期间则使BX寄存器的内容成为0500H。
(5) 属性操作符
· PTR
举例:已有数据定义如下:
TWO_BYTE DW ?
可以用以下语句对这两个字节赋予另一种类型定义:
ONE_BYTE EQU BYTE PTR TWO_BYTE
OTHER_BYTE EQU BYTE PTR ( TWO_BYTE + 1)
后者也可以写成:
OTHER_BYTE EQU ONE_BYTE + 1
这里ONE_BYTE和TWO_BYTE两个符号地址具有相同的段地址和偏移地址,但是它们的类型属性不同,前者为1,后者为2。
此外,有时指令要求使用PTR操作符。例如用
MOV [BX], 5
指令把立即数存入BX寄存器内容指定的存储单元中,但汇编程序不能分清是存入字单元还是字节单元,此时必须用PTR操作符来说明属性,应该写明:
MOV BYTE PTR [BX],5
或 MOV WORD PTR [BX],5
· 段操作符
例如,用段前缀指定某段的地址操作数
MOV AX,ES:[BX + SI]
· SHORT
例如: JMP SHORT TAG ;转移属性为短转移
.
.
.
TAG: MOV...
· THIS
例如: FIRST_TYPE EQU THIS BYTE
WORD_TABLE DW 100 DUP (?)
此时FIRST_TYPE的偏移地址和WORD_TABLE完全相同,但它是字节类型的;而WORD_TABLE则是字类型的。
又如: START EQU THIS FAR
MOV CX, 100
这样,MOV指令有一个FAR属性的符号地址START,这就允许其他段的JMP指令直接跳转到START来。
· HIGH和LOW
例如:
CONST EQU 0ABCDH
则 MOV AH, HIGH CONST
将汇编成 MOV AH, 0ABH
指令 MOV AH, LOW CONST
将汇编成 MOV AH, 0CDH
· 操作符的优先级
操作符的优先级别从高到低排列如下:
1. 在圆括号中的项,方括号中的项,结构变量(变量,字段。),然后是LENGTH、SIZE、WIDTH和MASK。
2. 名:(段取代)。
3. PTR,OFFSET,SEG,TYPE,THIS及段操作符。
4. HIGH和LOW。
5. 乘法和除法:*,/,MOD。
6. 加法和减法:+,-。
7. 关系操作:EQ,NE,LT,LE,GT,GE。
8. 逻辑:NOT。
9. 逻辑:AND。
10. 逻辑:OR,XOR。
11. SHORT。
汇编语言程序中表达式的值实际上是由汇编程序计算的,而程序员应该正确掌握书写表达式的方法,以减少出错的可能性。