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 32-bits / 64-bits Assembleur Discussion :

[MASM32] Problème de tableau


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 16
    Points : 5
    Points
    5
    Par défaut [MASM32] Problème de tableau
    Bonjour à tous,

    j'ai un petit problème stupide avec Masm32 pour utiliser une chaîne de caractères.
    J'ai une chaîne déclarée comme suit dans mes .data :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        buffer db '45 50 55 60 65 70',0
    Et je voudrais utiliser cette chaîne OCTET par OCTET, c'est-à-dire lire le premier byte, le traiter (routine quelconque), lire le suivant, etc..

    Ma routine est de la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        mov eax, [charactère lu]
        mov Variable2, [eax]
    (en gros hein)

    Masm32 refuse de compiler ça.

    J'ai voulu faire un tableau de charactères du type:
    mais au lieu du (?) mettre le contenu de mon tableau.
    Ca ne marche pas non plus, je n'arrive pas à le remplir..
    Comment faire?
    Et surtout, comment accéder à un élément du tableau, puis à l'autre etc.

    J'ai essayé buffer[0], buffer[1] etc mais ça ne passe pas.

    Je me suis dit ensuite que la data buffer n'était qu'un pointeur, donc qu'en incrémentant ce pointeur d'un octet à chaque fois ça devrait marcher.

    Impossible aussi.

    Je me perds entre les instructions "mov eax, byte ptr [buffer]" et autres indirections.. si quelqu'un pouvait m'aider je serais vraiment vraiment reconnaissant!

    d'avance, merci!

  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 petit bout de code qui devrait t'aider :

    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
    .data
    
    
    ;déclaration du buffer buffer db '45 50 55 60 65 70',0 ; en réalité compilé comme : db 34h, 35h, 20h, 35h, etc...
    .code
    ;chargement de l'adresse du buffer dans esi lea esi, buffer ; même chose que "mov esi, offset buffer" mov ecx, sizeof buffer ; ecx = taille de buffer (AVEC le 0 terminal !)
    boucle:
    movzx eax, byte ptr [esi] ; eax = octet de buffer (zéro étendu) ; ta routine de transformation de l'octet dans eax (ou AL) ;... dec ecx ; décrémente le compteur d'octet inc esi ; incrémente le pointeur sur buffer text ecx, ecx ; le compteur vaut-il 0 ? jnz boucle ; si ecx != 0 alors va sur le label boucle ; si ecx == 0 alors on continu ici
    Voilà une autre manière de procéder :

    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
    .data
    
    
    ;déclaration du buffer buffer db '45 50 55 60 65 70',0
    .code
    mov ecx, sizeof buffer ; ecx = taille de buffer xor edx, edx ; edx = 0 ; edx va nous servir d'index dans le tableau "buffer"
    boucle:
    movzx eax, byte ptr [buffer + edx] ; eax = octet contenu dans buffer + index ; ta routine dec ecx ; décrémente le compteur d'octet inc edx ; incrémente l'index du tableau test ecx, ecx ; compteur == 0 ? jnz boucle ; si oui => boucle encore, sinon => sort de la boucle

    J'espère que mon code est assez clair, n'hésites pas si tu as des questions.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Points : 562
    Points
    562
    Par défaut
    Je me perds entre les instructions "mov eax, byte ptr [buffer]" et autres indirections..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mov eax, byte ptr [buffer]
    EAX est un registre 32.
    BYTE PTR indique que l'on veur lire 8 bits.
    Cette instruction n'est donc pas correcte.

    Pour lire 1 octet :
    - soit vous utilisez le registre al (8 bits)
    - soit vous utilisez l'instruction movzx. Cette instruction va copier l'octet dans le registre en le complétant avec des 0 pour qu'il soit en 32 bits.

  4. #4
    Membre actif

    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    193
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 193
    Points : 277
    Points
    277
    Par défaut
    Salut,
    Le code est réellement confus.
    1)
    00000000 34 35 20 35 30 buffer db '45 50 55 60 65 70',0
    20 35 35 20 36
    30 20 36 35 20
    37 30 00
    La partie de gauche est ce qui est écris en mémoire,est ce bien ce que vous voulez ? (listing de désassemblage)

    pour placer la valeur 45 hexadécimale en data
    db 45h
    pour placer le chiffre ascii (visualisable ) en data
    db 34h,35h ou
    db '45'

    2) distingué valeur et adresse

    buffer db "un texte",0

    lea eax,buffer ;charge eax avec l'adresse de buffer
    mov dl,[eax] ;charge dl avec le premier byte se trouvant a l'adresse de buffer , ce qui donne la valeur ascii de u soit 117 en décimal.

    dl = 117


    Reste a savoir ce que vous voulez faire,en l'exprimant littérallement (sans code)
    ToutEnMasm

Discussions similaires

  1. [XHTML] problème de tableau
    Par virgul dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 28/04/2005, 07h18
  2. Problème de tableau
    Par tom06440 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 26/04/2005, 20h30
  3. Problème de tableau
    Par krfa1 dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 08/02/2005, 11h09
  4. [Win32/MASM32] Problème : LoadIcon
    Par lord_kalipsy dans le forum x86 32-bits / 64-bits
    Réponses: 6
    Dernier message: 27/12/2004, 18h44

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