2012-12-31 3 views
0

В чем разница в директиве .IF и IF в сборке? в документе для .Если:разница между .IF и IF в сборе

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

и IF:

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

ответ

4

ИФ-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 

Условия фактически проверяются во время выполнения.

+0

У вас есть пример, чтобы показать diffrent? –

+1

Добавленные примеры, по запросу. –

+0

Спасибо, например –

-2

Неправильный «ИФ-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

+1

Это вопрос MASM.Он использует разные директивы, чем GNU 'as' (aka gas). ** Настоящая ** часть вашего ответа относится только к синтаксису газа. См. Http://stackoverflow.com/tags/x86/info для ссылок на документы для разных ассемблеров. –

+0

Спасибо. Я этого не знаю. – Rasool