2012-09-21 1 views
0

J'ai du mal à comprendre comment sauter fonctionne réellement,Comprendre Sauts en langage d'assemblage (TASM)

laissez-moi vous donner un exemple, Ce que je veux est en boucle par L1 et sauts L2 si la valeur de DX est> 5 donc je l'ai fait, mais comment le code sait combien de lignes de code doivent être lues en L2?

MOV DX,0 
    MOV CX,10 
L1: 
    ADD DX,30H 
    MOV AH,02H 
    INT 21H 
    SUB DX,30H 
    ADD DX,1   
    CMP DX,5 
    JA L2 

LOOP L1 

après avoir sauté sur L2 si je veux effectuer plusieurs opérations i.e. A, B, C comment puis-je mettre fin à la L2 après la troisième opération?

L2: 
    A 
    B 
    C 
    ;Go back into the Loop L1 , How can i terminate L2 here ? 

Répondre

2

La CPU lit et exécute chaque instruction, une à la fois. Le flux de contrôle sera linéaire à moins qu'il ne rencontre une instruction qui modifie le flux (par exemple votre instruction de saut). Si vous souhaitez changer le flux, puis revenir à l'endroit où vous étiez, vous devez utiliser une instruction CALL au lieu d'un saut, puis vous revenez lorsque la CPU exécute une instruction RET. Cependant, si vous voulez aller à l'étiquette L1 de votre exemple, vous pouvez simplement ajouter une instruction JMP L1 à la fin de L2.

+0

déjà essayé ceci mais c'est une boucle non-stop quand j'ai utilisé JMP L1 – micheller

+2

@Greatmailz: Oui, vous devrez probablement faire une comparaison et sauter quand la condition n'est pas remplie, similaire à l'instruction 'JA' utilisée dans votre code . – gusbro

+0

ou placez une étiquette 'L3:' juste avant l'instruction 'loop', et sautez vers celle-ci - ce qui équivaut presque à la combinaison' call'/'ret', juste qu'elle n'implique pas la pile. – IdiotFromOutOfNowhere

2

Mes souvenirs d'assemblage 80x86 sont un peu vieux (20 ans), mais je suppose que si vous ne modifiez pas CX, vous pouvez appeler une boucle L1 de L2: code.

Si vous êtes à la fin de la boucle (puisque la boucle décrémente CX), il ne reviendra pas à L1 si votre JA à L2 est faite à la 10e fois.

1

Je ne connais pas les détails de cette langue, mais toutes les langues d'assemblage travaille essentiellement le même:

  • Si le code L2 est une fonction, à savoir si vous voulez revenir à la fonction appelée L2 (la fonction d'appelant) après que vous avez fini d'exécuter L2, vous voulez accéder à la première instruction de L2 en utilisant un appel. La dernière instruction de L2 serait alors un retour. Si, après L2, vous voulez toujours revenir au début de L1, vous devez utiliser un JUMP inconditionnel à l'étiquette L1 à la fin de votre code L2.

En règle générale, dans la plupart des langues d'assemblage, vous ne JUMP ou appel à des étiquettes: l'assembleur devinera pour vous combien de compenser cela se traduit si les instructions JUMP ou CALL ligne positive ou négative que vous utilisez dépendent de décalages relatifs par opposition aux adresses absolues. Si ce décalage est trop important, l'assembleur génère un message d'erreur lors de l'assemblage.