Programme d'assembleur

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. .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
    1. 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
      1. 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.
      2. 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!
      3. Désolé mais j'ai rien piégé -_-"
      4. 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...
      5. merci beaucoup ²²²
        et bonne fin de journée .