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
Bonsoir,
j'ai un programme à faire mais je trouve pas l'aidée pour me démarrer ,
il s'agit d'un programme assembleur qui lit les éléments (caractères) d'une matrice de la taille (n,m)
et affiche les mots présentés par les lignes et les mots présentés par les colonnes .
PS: en assembleur on considère les matrices (n,m) des tableaux de (n*m) éléments .
merci pour votre aide d'avance :)


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
0
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
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:
@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
0
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.
0
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
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!
0
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
Désolé mais j'ai rien piégé -_-"
0
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
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:
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...
0
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
merci beaucoup ²²²
et bonne fin de journée .
0