2016-07-11 6 views
-3

En essayant de faire une boucle qui calcule le premier nombre 10 en nombre Fibonacci. J'utilise "loop" au et du code, et cela ne fonctionne pas.La boucle d'assemblage ne fonctionne pas

xor cx, cx 
    mov cx, 8 
    mov bx, offset Array 
    mov [byte ptr bx], 0 
    mov [byte ptr bx+1], 1 
    mov bx, 1 

Fibo: 
    inc bx 
    mov al, [byte ptr bx-1] 
    mov [byte ptr bx], al 
    mov al, [byte ptr bx-2] 
    add [byte ptr bx], al 
    loop Fibo 
+2

Vous devriez éviter 'loop'. Il est lent, et utilise implicitement '[r/e] cx', ce qui signifie qu'en mode 32 ou 64 bits, le code que vous avez posté pourrait boucler beaucoup plus que prévu. – EOF

+0

Voir aussi http://stackoverflow.com/questions/32659715/assembly-language-x86-how-to-create-a-loop-to-calculate-fibonacci-sequence –

Répondre

1

La boucle est OK, mais vous détruisez votre bx par accident. Essayez de le déboguer avec le débogueur.

(downvotation, parce que c'est évident si vous le déboguez, même sur papier sans HW).

1

Je pense que vous devriez utiliser "byte ptr [bx]" au lieu de "[byte ptr bx]" pour tous vos types de pointeurs.

En outre, cette ligne va probablement causer un bug. Il réinitialise bx, il ne pointera donc plus vers l'adresse de Array. Utilisez plutôt "inc bx".

+0

Mais quand j'utilise Au lieu de "loop", cela : déc cx- cmp cx, 0- jf Fibo - Cela fonctionne. – Asher

+1

Il y a plusieurs façons que cela peut encore fonctionner. Un des étant l'adresse relative de Array dans la mémoire étant 0. Mais vous voulez un programme qui fonctionne toujours. Pas un qui fonctionne juste parfois. :) – Ariestinak

1

La boucle était correcte. J'étais confus sur la façon de déboguer des boucles. désolé.