Problème avec un code

Résolu
showbiz_hurricanes Messages postés 2 Date d'inscription lundi 22 août 2005 Statut Membre Dernière intervention 23 août 2005 - 22 août 2005 à 18:11
showbiz_hurricanes Messages postés 2 Date d'inscription lundi 22 août 2005 Statut Membre Dernière intervention 23 août 2005 - 23 août 2005 à 14:26
Bonjour

Pour un projet
universitaire, je dois concevoir un programme de tri en assembleur mais
celui ci ne fonctionne pas comme je le voudrai.



Le menu principal s'affiche correctement à la compliation mais lorsque je choisis un des options, il s'arrête.



Merci d'avance pour votre aide.



je vous montre le code que j'ai "pondu".



;Entrer des valeurs dans un tableau et trier le tableau



TITLE tritableau v1.0 beta(tri.asm)



INCLUDE IUTInfo.inc



.data

reponse BYTE ?



prompt BYTE "Tapez la majuscule A,B,C,D ou E:",0,0Ah



msgA BYTE "A-Remplir le tableau.",0,0Ah

msgB BYTE "B-Trier le tableau:",0,0Ah

msgC BYTE "C-Afficher les tableaux:",0,0Ah

msgD BYTE "D-Comparer les 2 tableaux:",0,0Ah

msgE BYTE "E-Quitter le programme!",0,0Ah



prompt1 BYTE "Voici le tableau une fois trié",0,0Ah





tab1 DWORD 50 DUP (?)

tab2 DWORD 50 DUP (?)







.Code

main PROC

call
Clrscr
;écran effacé

call
Crlf
;retour à la ligne



L1: call
Menu
;appel du sous-programme Menu



.IF (reponse ==
'A')
;condition d'appel du sous-programme Remplir

call
Remplir
;appel du sous-programme Remplir

call
Affichertbl1
;appel d'affichage du premier tableau

call
Trier
;appel du sous-programme Trier

call
Affichertbl2
;appel d'affichage du second tableau



.ELSEIF (reponse ==
'B') ;condition d'appel
du sous-programme Trier

call
Trier
;appel du sous-programme Trier

call
Affichertbl1
;appel d'affichage du premier tableau

call
Affichertbl2
;appel d'affichage du second tableau



.ELSEIF (reponse ==
'C') ;condition d'appel
du sous-programme Afficher

call
Affichertbl1
;appel d'affichage du premier tableau

call
Affichertbl2
;appel d'affichage du second tableau



;.ELSEIF (reponse ==
'D') ;condition d'appel du
sous-programme Comparer

;call
Comparer
;appel du sous-programme Comparer



.ELSEIF (reponse ==
'E') ;condition d'appel
du sous-programme Fin

call
Fin
;appel du sous-programme Fin



.ENDIF



exit

main ENDP



Menu PROC
near
;affichage du Menu

call Clrscr

call Crlf

mov edx, OFFSET prompt

call WriteString

mov eax, 500

call Delay

call Crlf

mov edx, OFFSET msgA

call WriteString

mov eax, 500

call Delay

call Crlf

mov edx, OFFSET msgB

call WriteString

mov eax, 500

call Delay

call Crlf

mov edx, OFFSET msgC

call WriteString

mov eax, 500

call Delay

call Crlf

mov edx, OFFSET msgD

call WriteString

mov eax, 500

call Delay

call Crlf

mov edx, OFFSET msgE

call WriteString

call ReadChar

mov
reponse,al
;enregistrement de la réponse de l'utilisateur

ret

Menu ENDP





Remplir PROC
near
;sous-programme de remplissage du tableau n°1

mov
ebx,50
;initialisation du nombre de valeurs à générer

mov
esi,0
;initialisation de la première case du tableau

L1: mov
eax,50
;valeur maximum à générer dans le tableau

call
RandomRange
;appel de la fonction de valeur aléatoire

mov
[tab1+esi],eax
;remplissage du tableau n°1

mov
[tab2+esi],eax
;remplissage du tableau n°2

add esi,TYPE
DWORD ;

dec
ebx
;décrémentation du nombre d'éléments à générer

cmp
ebx,0
;comparatif du nombre d'éléments restant à générer

jne
L1
;boucle forcée tant que les 2 tableaux ne sont pas remplis

ret

Remplir ENDP





Trier PROC
near
;sous-programme de tri du tableau n°2

mov
esi,0
;placement sur la première case du tableau n°1

mov ebx,0

add ebx,type dword







L3:

mov eax,[tab2+esi]

mov edx,[tab2+ebx]

cmp eax,edx

jge L1



L2: add esi,type dword

add ebx,type dword

cmp ebx,200

je L4

jmp L3







L1: mov [tab2+esi],edx

mov [tab2+ebx],eax

cmp ebx,200

je L4

jmp L2





L4: ret



Trier ENDP





Affichertbl1 PROC near

call Clrscr

mov dh,0

mov dl,0



mov ebx,0

mov esi,0



L1: cmp ebx,50

je L2

call gotoxy

mov eax,[tab1+esi]

call WriteInt

add esi,TYPE DWORD

inc ebx

add dl,5

cmp dl,50

jne L1

add dh,2

mov dl,0

jmp L1



L2: ret

Affichertbl1 ENDP



Affichertbl2 PROC near

;call Clrscr

mov dl,60

mov dh,0



mov ebx,0

mov esi,0



L1: cmp ebx,50

je L2

call gotoxy


mov eax,[tab2+esi]

call writeint


add esi,type dword

inc ebx

add dl,5

cmp dl,200

jne L1

add dh,2

mov dl,60

jmp L1



L2: ret



Affichertbl2 ENDP





;Comparer PROC near













Fin PROC near

exit



Fin ENDP



END main







Visit [www.nuxo.net www.nuxo.net] et vive le monde du libre!!!

2 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
23 août 2005 à 13:01
salut,

tu as un tableau de DWORD et jamais je ne vois reg*4 dans les acces.
si tu prog en 32bits, utilise sa capacité d'acces memoire.

lecture des elements du tableau ordre croissant ( esi = index )
mov esi,0
mov eax,[Tab+esi*4] ; lecture du premier element.
inc esi
mov edx,[Tab+esi*4] ; lecture du deuxième element.
cmp esi,50
je fin

lecture des elements du tableau ordre décroissant ( ecx = index )
mov ecx,50
loop1:
mov eax,[Tab+ecx*4-4] ; Tab[0..49] et 1 > ecx > 50.
loop loop1

@++
3
showbiz_hurricanes Messages postés 2 Date d'inscription lundi 22 août 2005 Statut Membre Dernière intervention 23 août 2005
23 août 2005 à 14:26
Merci pour cette réponse rapide



Le problème venait effectivement de l'accès mémoire! De plus l'affichage du tableau s'effectue correctement!

En bref mon programme fonctionne!





Merci

Visit [www.nuxo.net www.nuxo.net] et vive le monde du libre!!!
0
Rejoignez-nous