Programme d'assembleur
Fermé
wafa_isil-iste
Messages postés
12
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
31 décembre 2012
-
30 déc. 2012 à 21:57
wafa_isil-iste Messages postés 12 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 31 décembre 2012 - 31 déc. 2012 à 11:48
wafa_isil-iste Messages postés 12 Date d'inscription dimanche 30 décembre 2012 Statut Membre Dernière intervention 31 décembre 2012 - 31 déc. 2012 à 11:48
A voir également:
- Programme d'assembleur
- Programme demarrage windows 10 - Guide
- Désinstaller programme windows 10 - Guide
- Cette action ne peut pas être réalisée car le fichier est ouvert dans un autre programme - Guide
- Forcer la fermeture d'un programme - Guide
- Programme démarrage windows 10 - Guide
2 réponses
.386
.model flat, stdcall
option casemap : none
include \masm32\include\masm32rt.inc
.data
array dd 2, 5, 6, 3, 7, 1, 2, 8 ;tableau à trier
.code
start:
mov ebx, 0
tab:
print str$ (array[ebx])
cmp ebx, lengthof array
je fin ;si on arrive à la fin du tableau on quitte la boucle
inc ebx ;sinon on incrémente ebx
jmp tab
fin :
inkey "continuer..."
end start
.model flat, stdcall
option casemap : none
include \masm32\include\masm32rt.inc
.data
array dd 2, 5, 6, 3, 7, 1, 2, 8 ;tableau à trier
.code
start:
mov ebx, 0
tab:
print str$ (array[ebx])
cmp ebx, lengthof array
je fin ;si on arrive à la fin du tableau on quitte la boucle
inc ebx ;sinon on incrémente ebx
jmp tab
fin :
inkey "continuer..."
end start
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 30/12/2012 à 22:53
Modifié par nicocorico le 30/12/2012 à 22:53
Je me permet quelque petites remarques afin de prendre de bonnes habitudes:
- Pour mettre un registre à 0 comme dans le cas présent, il faut faire Xor EBX,EBX car c'est ce qu'il y a de plus compact.
- Tu compares la taille du tableau avec une unité de retard, de ce fait la boucle va s'exécuter hors limite du tableau...
- Et pour éviter ça il y a une optimisation à effectuer tant que possible, qui consiste à boucler avec le saut conditionnel au lieu de faire un Jmp ensuite:
-Et puis je ne vois pas en quoi ce programme répond au sujet...
Le chêne aussi était un gland, avant d'être un chêne
- Pour mettre un registre à 0 comme dans le cas présent, il faut faire Xor EBX,EBX car c'est ce qu'il y a de plus compact.
- Tu compares la taille du tableau avec une unité de retard, de ce fait la boucle va s'exécuter hors limite du tableau...
- Et pour éviter ça il y a une optimisation à effectuer tant que possible, qui consiste à boucler avec le saut conditionnel au lieu de faire un Jmp ensuite:
@tab: print str$ (array[ebx]) inc ebx cmp ebx, lengthof array jnz @tab
-Et puis je ne vois pas en quoi ce programme répond au sujet...
Le chêne aussi était un gland, avant d'être un chêne
yes, j'avais zappé la différence entre le bas niveau et le haut niveau (en programmation c, python, php ..) l'indice commence à zéro =)
sinon si, ça répond au sujet en partie, une matrice n'est qu'un tableau à 2 dimensions, donc avec un tableau de tableau tu peux faire une matrice, donc je considère que c'est une bonne base.
sinon si, ça répond au sujet en partie, une matrice n'est qu'un tableau à 2 dimensions, donc avec un tableau de tableau tu peux faire une matrice, donc je considère que c'est une bonne base.
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 31/12/2012 à 10:12
Modifié par nicocorico le 31/12/2012 à 10:12
En assembleur aussi l'indice commence à 0 bien sûr, simplement c'est la taille du tableau qu'il faut prendre en compte, il est donc nécessaire d'incrémenter EBX avant de comparer.
Et je ne pense pas que ce soit le fait d'accéder au tableau qui pose souci à Wafa_isil-iste, enfin peut-être que si...
Et à noter aussi que ta fonction «print str$ (array[ebx])» est spécifique à un langage, et aussi, elle n'a aucun moyen de savoir la taille de la chaine! Elle est forcément faite pour les chaines à taille initiale ou à 0 terminal, et ne peut fonctionner dans notre cas!
Et je ne pense pas que ce soit le fait d'accéder au tableau qui pose souci à Wafa_isil-iste, enfin peut-être que si...
Et à noter aussi que ta fonction «print str$ (array[ebx])» est spécifique à un langage, et aussi, elle n'a aucun moyen de savoir la taille de la chaine! Elle est forcément faite pour les chaines à taille initiale ou à 0 terminal, et ne peut fonctionner dans notre cas!
wafa_isil-iste
Messages postés
12
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
31 décembre 2012
31 déc. 2012 à 11:01
31 déc. 2012 à 11:01
Désolé mais j'ai rien piégé -_-"
nicocorico
Messages postés
799
Date d'inscription
dimanche 19 juin 2011
Statut
Membre
Dernière intervention
3 juillet 2018
138
Modifié par nicocorico le 31/12/2012 à 11:35
Modifié par nicocorico le 31/12/2012 à 11:35
Bah le plus simple c'est de recopier le mot dans un buffer...
Si on considère que "Largeur" est le nombre de colonnes de caractères dans la matrice, alors pour lire les mots en colonne, on lit octet par octet puis on ajoute "Largeur" puis pour lire les mots en ligne, on lit chaque caractère en ajoutant "Largeur" puis le mot à suivre commence à l'octet suivant.
Autrement dit, un truc du genre:
Après tu n'as pu qu'à appeler l'une ou l'autre avec un Call, en mettant l'index du mot voulu dans EAX... Attention toutefois, il n'y a aucun contrôle de dépassement là, c'est juste pour te montrer la marche à suivre...
Si on considère que "Largeur" est le nombre de colonnes de caractères dans la matrice, alors pour lire les mots en colonne, on lit octet par octet puis on ajoute "Largeur" puis pour lire les mots en ligne, on lit chaque caractère en ajoutant "Largeur" puis le mot à suivre commence à l'octet suivant.
Autrement dit, un truc du genre:
Matrice Db 'Mot1', 'Mot2', 'Mot3' Largeur DD 04 // Largeur de la matrice Hauteur DD 03 // Hauteur de la matrice Mot Db 0,0,0,0,0 // à dimensionner en fonction de la taille max Procedure CopieColonne(Index: Integer); Xor ECX,ECX @Bcl: Mov DL,[EAX + @Matrice] Mov [ECX + @Mot],DL Add EAX,Largeur Inc ECX Cmp ECX,hauteur Jnz @Bcl Ret Procedure CopieLigne(Index: Integer); Mul EAX,Largeur Xor ECX,ECX @Bcl: Mov DL,[EAX + @Matrice] Mov [ECX + @Mot],DL Inc EAX Inc ECX Cmp ECX,Largeur Jnz @Bcl Ret
Après tu n'as pu qu'à appeler l'une ou l'autre avec un Call, en mettant l'index du mot voulu dans EAX... Attention toutefois, il n'y a aucun contrôle de dépassement là, c'est juste pour te montrer la marche à suivre...
wafa_isil-iste
Messages postés
12
Date d'inscription
dimanche 30 décembre 2012
Statut
Membre
Dernière intervention
31 décembre 2012
31 déc. 2012 à 11:48
31 déc. 2012 à 11:48
merci beaucoup ²²²
et bonne fin de journée .
et bonne fin de journée .