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 :)

2 réponses

  1. 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
  2. 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
    1. 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
    2. 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
    3. wafa_isil-iste Messages postés 12 Statut Membre
       
      Désolé mais j'ai rien piégé -_-"
      0
    4. 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
    5. wafa_isil-iste Messages postés 12 Statut Membre
       
      merci beaucoup ²²²
      et bonne fin de journée .
      0