showbiz_hurricanes
Messages postés2Date d'inscriptionlundi 22 août 2005StatutMembreDernière intervention23 août 2005
-
22 août 2005 à 18:11
showbiz_hurricanes
Messages postés2Date d'inscriptionlundi 22 août 2005StatutMembreDernière intervention23 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!!!
cs_patatalo
Messages postés1466Date d'inscriptionvendredi 2 janvier 2004StatutModérateurDernière intervention14 février 20142 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