2012-12-31 4 views
0

quelle est la différence de .IF et IF directive dans l'assemblage? dans le document pour .IF:différence entre .IF et IF dans l'assemblage

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

et SI:

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

Répondre

4

IF-SINON-ELSE-ENDIF (sans le point) sont des directives de compilation. L'assembleur testera les conditions et, en fonction des résultats, n'inclura qu'une des séquences d'instructions dans le programme résultant. Ils ont la même fonction que les directives du préprocesseur C #if, #elif, #else et #endif. .IF-.ELSEIF-.ELSE-.ENDIF (avec le point) sont des directives d'exécution. L'assembleur générera des instructions de comparaison et de saut. Ils servent le même but que les déclarations C sous la forme if (...) { ... } else if (...) { ... } else { ... }.


Note: Je ne suis pas à l'aise masm, donc il pourrait y avoir des erreurs dans la notation de ces exemples.

something EQU 1 

somewhere: 
    mov ax, 42 
    IF something == 1 
    xor bx, 10 
    ELSE 
    mov bx, 20 
    ENDIF 
    add ax, bx 

Au cours de la phase de pré-traitement de la compilation, le compilateur testera les conditions dans IF et ELSEIF déclarations (sans le point), puis sélectionnez l'un des blocs de code qui prendra fin dans le programme. Le code ci-dessus est transformé en ce qui suit:

somewhere: 
    mov ax, 42 
    xor bx, 10 
    add ax, bx 

Un autre exemple:

something EQU 1 

somewhere: 
    mov ax, 42 
    mov dx, something 
    .IF dx == 1 
    xor bx, 10 
    .ELSE 
    mov bx, 20 
    .ENDIF 
    add ax, bx 

Au cours de la phase de pré-traitement de la compilation, le compilateur tournera .IF -statements (avec le point) dans les instructions d'assemblage. Le code ci-dessus est probablement transformé en ce qui suit:

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 

Les conditions sont réellement vérifiées au moment de l'exécution.

+0

Avez-vous par exemple pour montrer diffrent? –

+1

Ajout d'exemples, comme demandé. –

+0

Merci par exemple –

-2

Mauvais « IF-SINON-ELSE-ENDIF (sans le point) sont à la compilation des directives. L'assembleur testera les conditions, et en fonction des résultats, ne comprendra que l'une des séquences de déclarations Le programme résultant a la même fonction que les directives de préprocesseur C#if, #elif, #else et #endif

.IF-.ELSEIF-.ELSE-.ENDIF (avec le point) sont exécutés L'assembleur va générer des instructions de comparaison et de saut, qui ont la même fonction que les instructions C dans le formulaire if (...) {...} else if (...) {...} else {.. .}. "

Vrai .if marque le début d'une section de code qui est seulement considérée comme faisant partie du programme source en cours d'assemblage si l'argument (qui doit être une expression absolue) est non nulle.

Référence: http://web.mit.edu/gnu/doc/html/as_toc.html#SEC65

+1

Ceci est une question MASM.Il utilise différentes directives que GNU 'as' (aka gaz). La réponse ** true ** de votre réponse ne s'applique qu'à la syntaxe du gaz. Voir http://stackoverflow.com/tags/x86/info pour les liens vers des documents pour différents assembleurs. –

+0

Merci. Je ne le sais pas. – Rasool

Questions connexes