IF-ELSEIF-ELSE-ENDIF(不带点)是编译时指令。汇编器将测试条件,并根据结果,将只包括结果程序中的语句序列之一。它们的用途与 C 预处理器指令#if
、#elif
、#else
和相同#endif
。
.IF-.ELSEIF-.ELSE-.ENDIF(带点)是执行时指令。汇编器将生成比较和跳转指令。它们的用途与形式中的 C 语句相同if (...) { ... } else if (...) { ... } else { ... }
。
注意:我不精通masm,因此这些示例的符号可能存在错误。
something EQU 1
somewhere:
mov ax, 42
IF something == 1
xor bx, 10
ELSE
mov bx, 20
ENDIF
add ax, bx
在编译的预处理阶段,编译器将测试IF
和ELSEIF
语句(不带点)中的条件,并选择将在程序中结束的代码块之一。上面的代码变成如下:
somewhere:
mov ax, 42
xor bx, 10
add ax, bx
另一个例子:
something EQU 1
somewhere:
mov ax, 42
mov dx, something
.IF dx == 1
xor bx, 10
.ELSE
mov bx, 20
.ENDIF
add ax, bx
在编译的预处理阶段,编译器会将.IF
-语句(带点)转换为汇编指令。上面的代码大概变成了下面这样:
something EQU 1
somewhere:
mov ax, 42
mov dx, 1
cmp dx, 1
jnz else_clause
xor bx, 10
jmp past_endif
else_clause:
mov bx, 20
past_endif:
add ax, bx
条件实际上是在执行时检查的。