[英]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
在編譯的預處理階段,編譯器將測試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
這些條件實際上是在執行時檢查的。
錯誤的“IF-ELSEIF-ELSE-ENDIF(不帶點)是編譯時指令。匯編程序將測試條件,並根據結果,將只包括結果程序中的語句序列之一。它們服務於與 C 預處理器指令 #if、#elif、#else 和 #endif 的用途相同。
.IF-.ELSEIF-.ELSE-.ENDIF(帶點)是執行時指令。 匯編器會生成比較和跳轉指令。 它們與形式為 if (...) { ... } else if (...) { ... } else { ... } 的 C 語句的用途相同。”
True .if 標記一段代碼的開始,如果參數(必須是絕對表達式)非零,則該代碼段僅被視為正在匯編的源程序的一部分。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.