Somme de 10 chiffres et d'impression, de MSNA
J'ai écrit à la suite de l'assemblée du code pour ajouter des 10 numéros.Je suis en mesure de le compiler et de l'exécuter, mais j'obtiens un résultat incorrect.
Je voulais juste savoir comment faire pour imprimer la valeur de total sur le talus d'éboulis.
section .data
num1: dw 10, 20, 30, 40, 50, 10, 20, 30, 40, 50
total: dw 0
msg : db "sum=%d",10,0
section .text
extern _printf
global _main
_main:
push ebp
mov ebp,esp
mov ebx,num1 ;point bx to first number
mov ecx,10 ;load count of numbers in ecx
mov eax,0 ;initialize sum to zero
loop:
add eax,[ebx]
add ebx,2
sub ecx,1
jnz loop
mov [total],eax
push total
push msg
call _printf
pop ebp
mov esp,ebp
ret
solution
section .data
num1: dd 10, 20, 30, 40, 50, 10, 20, 30, 40, 50,300
total: dd 0
msg : dd "sum=%d",10,0
section .text
extern _printf
global _main
_main:
push ebp
mov ebp,esp
mov ebx,num1 ;point bx to first number
mov ecx,11 ;load count of numbers in ecx
mov eax,0 ;initialize sum to zero
loop:
add eax,[ebx]
add ebx,4
sub ecx,1
jnz loop
mov [total],eax
push dword [total]
push msg
call _printf
mov esp,ebp
pop ebp
ret
Ce "mauvais résultat" voulez-vous obtenir ?
je suis de mieux en valeur grabage
je suis de mieux en valeur grabage
OriginalL'auteur santosh singh | 2013-01-08
Vous devez vous connecter pour publier un commentaire.
Je vois un couple de questions ici. Tout d'abord, vous avez
num1
ettotal
déclaré quedw
.dw
peut sembler comme il signifie "dword", mais il signifie "mot de données". Vous voulez que cesdd
- "les données dword"... puisque c'est la façon dont vous les utilisez. (etadd ebx, 4
pas 2) Si vous avez vraiment besoin d'utiliser word (16 bits) les valeurs dans le code 32 bits, il peut être fait, mais c'est maladroit.Le deuxième problème que je vois est que
push total
avant votrecall _printf
pousse l'adresse detotal
. Vous souhaitez des "[contenu]" de mémoire ici, doncpush dword [total]
. (push msg
est correct)Après cela, vous voulez probablement
add esp, 8
(je préfère l'écrire commeadd esp, 4 * 2
- deux paramètres 4 octets). Il est possible de "reporter" cette pile de nettoyage -mov esp, ebp
va vous arranger, mais il doit être fait AVANT lepop ebp
!!!... il y a peut-être plus...
OriginalL'auteur Frank Kotler
Vous êtes en utilisant 32 bits, la mémoire à accès à travailler avec des valeurs de 16 bits.
Chaque élément de la matrice est de 16 bits de large. Cependant, depuis
eax
est 32 bits, le suivant traite le tableau, comme si chaque élément a également été 32 bits:La suite n'est pas tout à fait correct, pour exactement la même raison:
Je pense qu'il y a aussi une question à laquelle vous poussez la adresse de
total
avant d'appelerprintf()
, tandis que vous devriez probablement à pousser ses valeur.Aussi, comme l'a souligné @JasonD, vous devez nettoyer la pile après l'appel de
printf()
.Enfin, la
instruction doit être supprimée car il n'est de corrompre votre pointeur de pile.
printf
Oh oui, j'ai oublié à ce sujet. Je vais ajouter une note à la réponse. Merci.
bonne observation +1 🙂
OriginalL'auteur NPE
dw définit 16 bits entités mais
add eax,[ebx]
est l'ajout de 32 bits entités. Soit changer dw à dd ou mettre WORD PTR avant [ebx]. Aussi, comme NPE points, vous avez besoin de changer la façon dont vous gérer le stockage eax en total.OriginalL'auteur Jim Rhodes