簡體   English   中英

.IF 和 IF 在匯編中的區別

[英]difference between .IF and IF in assembly

.IF 和 IF 指令在匯編中有什么區別? 在 .IF 文件中:

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

對於 IF :

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

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

這些條件實際上是在執行時檢查的。

錯誤的“IF-ELSEIF-ELSE-ENDIF(不帶點)是編譯時指令。匯編程序將測試條件,並根據結果,將只包括結果程序中的語句序列之一。它們服務於與 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM