汇编学习笔记48

四、条件汇编

条件汇编语句提供根据某种条件决定是否汇编某段源程序的功能。

在程序中使用条件汇编语句的主要目的是 (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

宏调用允许使用递归调用,此时一定要有条件语句结束递归调用。

posted @ 2011-01-24 19:17  杨海龙  阅读(528)  评论(0编辑  收藏  举报