装配中.IF和IF之间的差异

时间:2012-12-31 19:29:15

标签: assembly if-statement masm masm32

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

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

和IF:

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

2 个答案:

答案 0 :(得分:4)

IF-ELSEIF-ELSE-ENDIF(不带点)是编译时指令。汇编程序将测试条件,并根据结果,只包含结果程序中的一个语句序列。它们与C预处理程序指令#if#elif#else#endif具有相同的用途。

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


注意:我不能熟练使用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

在执行时实际检查条件。

答案 1 :(得分:-2)

<强>错误 “IF-ELSEIF-ELSE-ENDIF(没有点)是编译时指令。汇编程序将测试条件,并根据结果,只包含结果程序中的一个语句序列。它们服务相同用作C预处理程序指令#if,#elif,#else和#endif。

.IF-.ELSEIF-.ELSE-.ENDIF(带点)是执行时指令。汇编程序将生成比较和跳转指令。它们与表单中的C语句具有相同的目的if(...){...} else if(...){...} else {...}。“

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

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