Mon programme bloque

rhumsek Messages postés 17 Date d'inscription lundi 3 février 2003 Statut Membre Dernière intervention 5 novembre 2011 - 12 août 2004 à 22:57
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 - 13 août 2004 à 17:48
slt j'ai améliore mon programme mais il provoque une erreure lors
du calcul de la somme des entiers saisi (sommeentier)
POURTANT il exécute bien les deux premieres procédure
il bloque à partir de sommeentier
pourquoi????

TITLE affichage de texte en quatre couleur
.386
.MODEL flat,stdcall
.STACK 4096
ExitProcess PROTO,dwExitCode:DWORD
DumpRegs PROTO

INCLUDE Irvine32.inc

intcount=3

.data
intval SDWORD intcount DUP(?)
mess BYTE "Saisissez un entier sign",82h," :",0
mess1 BYTE "voici les entiers saisient dans la pile",0
mess2 BYTE "voici la somme des entiers dans la pile",0
.code
main PROC

call clrscr
mov esi,OFFSET intval
mov ecx,intcount
call saisirentiers
mov eax,1000
call delay
call afficherentiers
mov eax,2000
call delay
call sommeentier
mov eax,1000
call delay
call affichsomme
exit
main ENDP

saisirentiers PROC

pushad

L1:
mov edx,OFFSET mess
call writestring
call crlf
call readint
call crlf
mov dh,10
mov dl,20
call gotoxy
call clrscr
mov [esi],eax
add esi,4
loop L1
popad
ret

saisirentiers ENDP

afficherentiers PROC

call clrscr
mov edx,OFFSET mess1
call writestring
call crlf

L1:
mov eax,[esi]
call writeint
add esi,4
call crlf
loop L1
ret

afficherentiers ENDP

sommeentier PROC

push esi
push ecx
mov eax,0

L1:
add eax,[esi]
add esi,4
loop L1
L2:
pop ecx
pop esi
ret

sommeentier ENDP

affichsomme PROC

push edx
mov edx,OFFSET mess2
call writestring
call writeint
call crlf
pop edx
ret

affichsomme ENDP

END main

rhumsek

7 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
13 août 2004 à 11:13
salut,

verifie la valeur de ecx a l'entrée de la fonction.

@++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
13 août 2004 à 14:08
sommeentier PROC

push esi
push ecx
mov eax,0

L1:
add eax,[esi]
add esi,4
loop L1
L2:
pop ecx
pop esi
ret

sommeentier ENDP

jla trouve bizarre ta fonction ,aucune condition, rien, jme demande mm si elle ne fait pas une boucle infinie, et puis jne vois pas les 2 operandes, ou sont ils ? enfin, tu peux faire plus simple je pense, regarde :

;renvoie resultat
sommeentier proc ;op1 [esp + 4], op2 [esp + 8]

mov eax, [esp + 4]
mov ebx, [esp + 8]

add eax, ebx

ret 8

sommeentier ENDP

Pas besoin de sauver les registres généraux, comme eax, ecx ou edx.
Dis moi si cette fonction ne marche po, mais apparemment elle devrait.

++
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
13 août 2004 à 15:47
AlexMAN: loop EST une condition (jmp if ecx != 0), et provoque la décrémentation de ecx a chaque passage
0
cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
13 août 2004 à 15:58
re,

as-tu verifié la valeur de ecx qui a mon avis a du bouger.

encore + simple:

sommeentier proc ;op1 [esp + 4], op2 [esp + 8]
mov eax, [esp + 4]
add eax, [esp + 8]
ret 8

sinon, il faudrait pusher ebx.

mais ça ne colle pas car nous avons affaire a un tableau d'entier.
La methode est bonne mais a mon avis, ecx n'as pas la valeur qu'il devrait avoir.

essai ça:

main PROC

call clrscr
mov esi,OFFSET intval
mov ecx,intcount
call saisirentiers
mov eax,1000
call delay
call afficherentiers
mov eax,2000
call delay
mov ecx,intcount <- juste ça
call sommeentier
mov eax,1000
call delay
call affichsomme
exit
main ENDP

@++
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
13 août 2004 à 16:44
ah ok, dsl je parle trop vite ;)
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 août 2004 à 17:40
AlexMAN> surtout tu retiens 'loop' comme bouclage OBSOLETE.
Me semble lui avoir deja dit que ce bouquin n'a que des vieilleries en exemples.

ciao...
BruNews, Admin CS, MVP Visual C++
0
cs_AlexMAN Messages postés 1536 Date d'inscription samedi 21 décembre 2002 Statut Membre Dernière intervention 24 mai 2009 1
13 août 2004 à 17:48
Ah c pour ca ke je connais pas, je ne connais que le top nivo moi ;)
0
Rejoignez-nous