2009-11-13 4 views
1

On m'a demandé de créer une boucle simple en langage assembleur mais j'ai des problèmes car la boucle ne se termine pas quand elle le devrait, elle continue dans une boucle infinie.Impossible de sortir d'une simple boucle d'assemblage

J'ai besoin de donner à l'ECX une variable qui est prise en entrée, mais dans mon code ci-dessous même si je spécifie le compteur directement tombe toujours dans une boucle infinie.

Mon code est ici (mise à jour):

PasteBin Code

Le code peut contenir des erreurs autres que la boucle réelle.

// Edité pour l'explication des exigences des programmes ...

Le programme a besoin de prendre une entrée « n » qui sera utilisé comme compteur pour la boucle. Je prends alors l'entrée "n" plus de nombres, quand un nombre est positif j'ai besoin d'ajouter cela à la variable postot, quand négatif j'ai besoin d'ajouter cela à la variable negatot. Après avoir entré les numéros "n", j'imprime les résultats pour chaque variable et le programme se termine.

Edit 2:

Correction du problème de la boucle en effaçant la pile correctement donc j'ajouté:

 add esp,8 

et:

next: push ecx 
     ... 
pop ecx 
loop next 

Ce qui a résolu le problème de la boucle.

+0

Je ne peux même pas dire quelle boucle est en cause. – bmargulies

+1

Il n'y a qu'une seule boucle. – Ash

Répondre

1

Ok, je l'ai compris. . . Vous lisez int le numéro de l'utilisateur. Ensuite, sur la ligne 41, vous sautez à la ligne 47 ou à la ligne 43.

Si vous allez à la ligne 43, vous atteignez la ligne 45 qui passe à la ligne 49 (fin). Si à la place, vous êtes allé à la ligne 47, vous passerez à la ligne 49 (fin).

Dans les deux cas, vous revenez à la ligne 29 (suivant).

Vous attendez que votre registre ecx décrémente à chaque fois que la boucle est atteinte, et qu'il reste inchangé pendant le traitement de la boucle.

Avez-vous essayé d'appuyer sur ecx autour de la ligne 29, et de le faire sauter juste avant de faire une boucle?

+0

Pour un test rapide de cela, supprimez tout de lignes 30 à 49. Si jamais il quitte la boucle, alors vous savez que quelque chose à l'intérieur de la boucle change la valeur de ecx – Andres

+0

Cela fonctionne quand je supprime tout, je peux voir dans la fenêtre Auto (Visual Basic C++) le compteur ECX décrémentation. – Ash

+1

Avez-vous essayé de pousser et d'ouvrir l'ecx? – Andres

0

Je vois deux erreurs:

  • Il y a un JG positive là-bas après que vous incrémenter un pointeur de pile. Êtes-vous sûr de vouloir vérifier le résultat du bidouillage avec votre cadre de pile, plutôt que la valeur du nombre que vous avez entré?

  • jmp end n'a pas: Juste après end vient un loop next. Je ne vois aucune condition pour terminer la boucle.

+0

Je pensais que la boucle se terminerait automatiquement si ECX est 0? – Ash

+0

Il devrait, vous pouvez toujours essayer sub ecx, 1 cmp ecx 0 je SOMEOTHERLABEL – Andres

Questions connexes