四、条件汇编
条件汇编语句提供根据某种条件决定是否汇编某段源程序的功能。
在程序中使用条件汇编语句的主要目的是 (1) 通过在条件汇编前或条件汇编时改变某种条件,从而方便地产生功能不同的程序 (2) 增加宏定义的能力
(一) 条件汇编伪指令
条件汇编语句的一般格式如下:
IFxxx 条件表达式
语句组1
ELSE
语句组2
ENDIF
IFxxx是条件伪指令助词符的一般形式,其中xxx表示构成条件伪指令助记符的其它字符。
完整的条件伪指令助记符如下:
IF IFE IFDEF IFNDEF IF1 IF2 IFB IFNB IFIDN IFDIF
结束语句是ENDIF
1. 伪指令IF和IFE
伪指令IF的一般格式如下:
IF 表达式
<语句序列>
ENDIF
如果表达式的值不等于0,则条件满足,即条件为真
伪指令IFE的一般格式如下:
IFE 表达式
<语句序列>
ENDIF
如果表达式的值等于0,则条件满足,IFE伪指令的条件与伪指令IF的条件相反
例1:
在下面的条件语句中,如果MFLAG的值不为0, 即条件满足,那么就汇编语句组1, 否则汇编语句组2
IF MFLAG
MOV AH, 0
INT 16H
ELSE
MOV AH, 1
INT 21H
ENDIF
例2:
在下面的条件语句中,条件表达式是一个关系表达式
IF PORT EQ 0
PORTADDR = 3F8H
IVECIH = 0BH
IMASKV = 11110111B
ENDIF
例3:
如下定义的宏SHIFT, 使用了重复块和结束宏扩展的伪指令EXITM
SHIFT MACRO OP, N
CONT=0
REPT N
SHL OP, 1
CONT=CONT+1
IF CONT GE N
EXITM
ENDIF
ENDM
INC OP
ENDM
SHIFT AX, 1
+ SHL, AX, 1
1 INC AX
SHIFT BX, 3
1 SHL BX, 1
1 SHL BX, 1
1 SHL BX, 1
2 INC BX
2. 伪指令IFDEF和IFNDEF
伪指令IFDEF一般格式如下:
IFDEF 符号
<语句序列>
ENDIF
如果符号已被定义或被说明为外部符号,则条件满足,即条件为真。
伪指令IFNDEF格式如下:
IFNDEF 符号
<语句序列>
ENDIF
如果符号未定义或未被说明成外部符号,则条件满足,即条件为真
伪指令IFDEF和IFNDEF条件相反。
3. 伪指令IF1, IF2
伪指令IF1的格式如下:
IF1
<语句序列>
ENDIF
若是第一遍扫描,则条件为真。
伪指令IF2的格式如下:
IF2
<语句序列>
ENDIF
若是第二遍扫描,则条件为真
例:
宏BRAN产生一条转向X的转移指令, 当它相对于X的距离小于128字节时产生JMP SHORT X否则产生JMP NEAR PTR X。 (X必须位于该转移指令之后,即低地址区)
BRAN MACRO X
IF ($ – x) LT 128
JMP SHORT X
ELSE
JMP NEAR PTR X
ENDIF
ENDM
宏调用:
BRAN X
宏展开:
如果X与BRAN指令之间的距离小于128时
+ JMP SHORT X
否则
+ JMP NEAR PTR X
例:
宏指令GOTO L, X, REL, Y(其中REL可以是Z, NZ, L, NL等)可以根据不同情况产生无条件转移指令或比较和条件转移指令
GOTO MACRO L, X, REL, Y
IFB <REL>
JMP L
ELSE
MOV AX, X
CMP AX, Y
J&REL L
ENDIF
ENDM
宏调用:
GOTO LOOP, SUM, NZ, 15
+ MOV AX, SUM
+ CMP AX, 15
+ JNZ LOOP
GOTO EXIT
+ JMP EXIT
宏调用允许使用递归调用,此时一定要有条件语句结束递归调用。