0

.IF 和 IF 指令在汇编中有什么区别?在 .IF 的文档中:

.IF condition1 
      statements
   [[.ELSEIF condition2 
            statements]]
   [[.ELSE
            statements]]
      .ENDIF

对于 IF :

IF expression1
      ifstatements
   [[ELSEIF expression2
            elseifstatements]]
   [[ELSE
            elsestatements]]
   ENDIF
4

2 回答 2

4

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

在编译的预处理阶段,编译器将测试IFELSEIF语句(不带点)中的条件,并选择将在程序中结束的代码块之一。上面的代码变成如下:

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

条件实际上是在执行时检查的。

于 2012-12-31T19:45:12.410 回答
-2

错误 的“IF-ELSEIF-ELSE-ENDIF(不带点)是编译时指令。汇编器将测试条件,并根据结果,将只包括结果程序中的语句序列之一。它们服务于与 C 预处理器指令 #if、#elif、#else 和 #endif 的目的相同。

.IF-.ELSEIF-.ELSE-.ENDIF(带点)是执行时指令。汇编器将生成比较和跳转指令。它们与 if (...) { ... } else if (...) { ... } else { ... } 形式的 C 语句的用途相同。”

.if 标记一段代码的开始,如果参数(必须是绝对表达式)非零,则该段代码仅被视为正在汇编的源程序的一部分。

参考: http ://web.mit.edu/gnu/doc/html/as_toc.html#SEC65

于 2016-12-20T09:17:35.463 回答