Programme d'assembleur

wafa_isil-iste Messages postés 12 Statut Membre -  
wafa_isil-iste Messages postés 12 Statut Membre -
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 :)

A voir également:

2 réponses

un_neurone
 
.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 846 Statut Membre 138
 
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
un_neuronne
 
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 846 Statut Membre 138
 
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 Statut Membre
 
Désolé mais j'ai rien piégé -_-"
0
nicocorico Messages postés 846 Statut Membre 138
 
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 Statut Membre
 
merci beaucoup ²²²
et bonne fin de journée .
0