ИФ-ELSEIF-ELSE-ENDIF (без точки) являются директивы компиляции. Ассемблер проверит условия и, основываясь на результатах, будет включать только одну из последовательностей операторов в полученной программе. Они служат той же цели, что и директивы препроцессора C #if
, #elif
, #else
и #endif
.
.IF-.ELSEIF-.ELSE-.ENDIF (с точкой) - это директивы времени исполнения. Ассемблер будет генерировать команды сравнения и прыжка. Они служат той же цели, что и операторы С в форме 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
На этапе предварительной обработки компиляции, компилятор будет проверять условия в 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
-statements (с точкой) в инструкции по сборке. Вышеприведенный код, вероятно, превращается в следующее:
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
Условия фактически проверяются во время выполнения.
У вас есть пример, чтобы показать diffrent? –
Добавленные примеры, по запросу. –
Спасибо, например –