MASM 6.0引入.IF、.ELSEIF、.ELSE和.ENDIF伪指令,它们类似高级语言中IF、THEN、ELSE和ENDIF的相应功能。
.IF 条件表达式 ;条件为真(值为非0),执行分支体
分支体
[.ELSEIF 条件表达式 ;前面IF [以及前面ELSEIF] 条件为假(值为0),
;并且当前ELSEIF条件为真,执行分支体
分支体 ]
[.ELSE ;前面IF [以及前面ELSEIF] 条件为假,
;执行分支体
分支体 ]
.ENDIF ;分支结束
条件表达式中的中操作符
操作符 | 功能 | 操作符 | 功能 | 操作符 | 功能 |
== | 等于 | && | 逻辑与 | CARRY? | CF=1? |
!= | 不等于 | || | 逻辑或 | OVERFLOW? | OF=1? |
> | 大于 | ! | 逻辑非 | PARITY? | PF=1? |
>= | 大于等于 | | | SIGN? | SF=1? |
< | 小于 | & | 位测试 | ZERO? | ZF=1? |
<= | 小于等于 | () | 改变优先级 | | |
实例1
这些伪指令在汇编时自动生成相应的比较和条件转移指令序列,实现程序分支。
对于采用条件控制伪指令编写的双分支结构的源程序段:
.IF ax==5
mov bx,ax
mov ax,0
.ELSE
dec ax
.ENDIF
查看其形成的列表.LST文件,如下所示(带有*号的语句是有汇编程序产生的):
.IF ax==5
* cmp ax,05h
* jne @C0001
mov bx,ax
mov ax,0
.ELSE
* jmp @C0003
*@C0001: dec ax
.ENDIF
*@C0003:
实例2
例5.1:用条件控制伪指令实现有根判断的源程序
.model small
.stack
.data
_a sbyte ?
_b sbyte ?
_c sbyte ?
tag byte ?
.code
.startup
mov al,_b
imul al
mov bx,ax ;bx中为b2
mov al,_a
imul _c
mov cx,4
imul cx ;ax中为4ac
.if sword ptr bx >= ax ;比较二者大小
mov tag,1 ;第一分支体:条件满足,tag←1
.else
mov tag,0 ;第二分支体:条件不满足,tag←0
.endif
.exit 0
end