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 (ドットなし) はコンパイル時のディレクティブです。アセンブラは条件をテストし、結果に基づいて、ステートメントのシーケンスの 1 つだけを結果のプログラムに含めます。これらは、 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

コンパイルの前処理段階で、コンパイラはIFandELSEIFステートメント (ドットなし) の条件をテストし、プログラムで最終的に使用されるコード ブロックの 1 つを選択します。上記のコードは次のようになります。

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 (ドットなし) はコンパイル時のディレクティブです。アセンブラーは条件をテストし、結果に基づいて、ステートメントのシーケンスの 1 つだけを結果のプログラムに含めます。それらは、 C プリプロセッサ ディレクティブ #if、#elif、#else、および #endif と同じ目的。

.IF-.ELSEIF-.ELSE-.ENDIF (ドット付き) は実行時のディレクティブです。アセンブラは、比較命令とジャンプ命令を生成します。これらは、if (...) { ... } else if (...) { ... } else { ... } の形式の C ステートメントと同じ目的を果たします。

True .if は、引数 (絶対式でなければならない) がゼロでない場合にのみ、アセンブルされるソース プログラムの一部と見なされるコードのセクションの開始を示します。

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

于 2016-12-20T09:17:35.463 に答える