IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

x86 16-bits Assembleur Discussion :

Mettre la diagonale d'une matrice à 0


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut Mettre la diagonale d'une matrice à 0
    Salut les amis ...
    Ma tête va exploser dans un exercice d'assembleur sur masm615
    Il faut mettre la diagonale d'une matrice à zéro

    J’ai trouve l'idée mais je ne sais pas l'implémenter en assembleur
    L’indice des éléments de la diagonale est le nb des lignes (ou colonne) + 1 et on reboucle c.-à-d. a partir du dernier élément de la diagonale on ajoute l'indice ....

  2. #2
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    voilà un exemple (syntaxe MASM32) pour une matrice d'entier (4 octets par entier) de 10 * 10.

    On peut sûrement optimiser mais ça donne idée. On peut ajuster la taille des éléments et la taille de la matrice, le seul impératif étant que la matrice soit carrée (nombre de ligne = nombre de colonne).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    SetZeroMatrixDiag PROC uses ecx edx, aMatrix:DWORD ; aMatrix = pointeur sur matrice
    	LOCAL Counter:DWORD
     
    	mov Counter, 0
    	jmp @testCounter
     
    @incCounter:
    	inc Counter
     
    @testCounter :
    	cmp Counter , 10d ; 10 = longueur d'une ligne de la matrice
    	jge @exit
    	mov ecx, Counter
    	imul ecx,ecx, 40d ; 4 * 10 ; avec 4 = taille d'un DWORD et 10 = longueur d'une ligne.
    	add ecx, aMatrix 
    	mov edx, Counter
    	mov dword ptr [ecx+edx*4], 0 ; 4 = taille d'un DWORD
    	jmp @incCounter	
    @exit:
     
    	ret
     
    SetZeroMatrixDiag endp
    Le principe est le suivant :

    - Prend compteur (compteur ligne et colonne puisqu'on se déplace sur la diagonale).
    - Multiplie compteur par taille ligne
    - Ajoute l'adresse de base de la matrice (adresse indice [0][0]).

    A ce moment là on est à [0][0] ou [1][0] ou [2][0], etc. suivant la boucle.

    - Ajoute compteur*4 à adresse. On est alors à [0][0] ou [1][1] ou [2][2] etc.
    - Met un zéro à cette adresse.
    - Incrémente compteur.
    - Boucle tant que compteur est inférieur à nombre ligne.

  3. #3
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut
    Merci ça marcher chez moi
    mais sur masm615 ... votre masm32 n'est pas très limite comme masm615
    par exemple il y a 3 opérandes pour mul et le ptr qui je crois pointe sur le 1ére élément de la matrice …


    voila mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    ;i le nb des ligne et tab mon tableau de la matrice
     
    mov ecx , i
    mov edx , 0
    mov edi , 0
     
    foor :
     
    mov eax , i
    mov edi , edx
     
    mul edx
    add eax , edi
     
    mov [tab + 4*eax ] , 0
     
    inc edi
    mov edx , edi
     
     
    loop foor
    mais j'ai une question au langage C le code est comme ça pour une matrice (3,3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     /*votre code*/
     
        for(i=0;i<3;i++)
        T[3*i + i] = 0 ; 
     
     
     /*ma proposition*/
     
        for(i=0;i<3;i++)
         {
                         T[ j  ] = 0 ;
                         j = j + 3 + 1 ;                                         
         }
    Alors comment écrire mon code sur masm615
    Le tableau doit être comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [Nom du tableau + facteur*reg d'index + constante]

  4. #4
    Membre du Club
    Inscrit en
    Août 2007
    Messages
    260
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 260
    Points : 43
    Points
    43
    Par défaut
    j'ai trouvé la solution
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    mov ecx , i
    mov edx , 0
    mov eax , i
    mov tab , 0
     
     
    foor :
     
    add edx , eax
    inc edx
    mov [tab + 4*edx ] , 0
     
     
     
     
    loop foor

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 26/03/2013, 16h48
  2. Remplir la diagonale d'une matrice sans boucle FOR-END
    Par francois_S dans le forum MATLAB
    Réponses: 3
    Dernier message: 30/03/2010, 08h32
  3. mettre des vecteurs dans une matrice
    Par thtghgh dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/01/2010, 18h03
  4. Réponses: 3
    Dernier message: 13/09/2007, 18h26
  5. Réponses: 8
    Dernier message: 09/07/2006, 14h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo