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

Assembleur Discussion :

Compter le nombre de caractères d'une chaîne - chercher un caractère


Sujet :

Assembleur

  1. #1
    Invité
    Invité(e)
    Par défaut Compter le nombre de caractères d'une chaîne - chercher un caractère
    Bonjour,

    Je viens vous demander de l'aide pour la programmation sur l'assembleur GNU Linux AT&T !

    Je n'arrive pas à comprendre comment on peut trouver le nombre de caractères dans une variable string en utilisant une boucle avec les codes ASCII, ni comment savoir si la string contient une lettre qu'on choisit en utilisant le code ASCII.

    De plus je suis perdu avec le CMP, si la condition est valide (c'est-à-dire qu'ils sont égaux) on saute la prochaine commande ?

    Merci à vous et joyeux Noël !
    Dernière modification par Alcatîz ; 01/01/2018 à 21h36. Motif: orthographe

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Pour autant que je sache, en assembleur x86 (ainsi que z80, 68k, et autres processeurs CISC), CMP ne fait rien d'autre que régler le registre des flags. Ce qui est important, c'est l'instruction de saut conditionnel qui suit (genre JNZ pour "jump if nonzero", sachant que "zero" signifie que les deux opérandes de CMP était égales).
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Merci de votre réponse,
    Mais du coup comment peut-on "compter" le nombre de caractère d'un variable?
    Par exemple:
    .data
    var1: .string "le nombre"
    et que sur le terminal ca affiche "9"
    merci

  4. #4
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    il faudrait déjà savoir comment est codée la chaîne de caractères, il y a à ma connaissance deux façons d'écrire les chaîne de caractères en mémoire :

    - avec un caractère spécial qui marque la fin de la chaîne (par exemple $ ou null)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    chaine_dollar:
    db "bonjour$"
    chaine_null:
    db "bonjour",0
    dans ce cas il faut faire une boucle qui démarre au début de la chaine et qui compte le nombre de caractère avant de rencontrer le caractère de fin

    - ou avec les premiers octets représentant le nombre d'octets de la chaîne et ensuite les caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    chaine_byte:
    db 7,"bonjour"
    chaine_word:
    db 7,0,"bonjour"
    chaine_dword:
    db 7,0,0,0"bonjour"
    Dans ce cas c'est encore plus facile, il te suffit de lire le nombre contenu dans le ou les premier(s) octet(s) pour savoir la taille de la chaîne, mais ce genre d'écriture de chaîne n'est pas très utilisé.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci de ta réponse !
    J'avais vu aussi en code ASCII la fin de la chaîne de caractères est représentée par zéro, du coup j'ai pensé à parcourir la chaîne et a incrémenter une valeur jusqu'à ce que le parcours rencontre 0.
    Mais comment dois-je l'écrire syntaxiquement parlant ?
    Dernière modification par Alcatîz ; 01/01/2018 à 21h38. Motif: orthographe

  6. #6
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 18 160
    Par défaut
    Le plus simple, tu fais ta boucle, une fois le zéro atteint tu soustrait l'adresse de début de chaîne à l'adresse courante.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

  7. #7
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Oui !! c'est ce que je pensais mais je ne connais pas la syntaxe ou la "commande" pour parcourir un string ...

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    En gros, tu ne connais pas le langage assembleur du tout?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Pas au complet complet..

  10. #10
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 391
    Par défaut
    Généralement, on écrit une boucle avec un contenu de ce genre (pseudocode 8086)
    Code pseudocode : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     SI = (adresse de la chaîne)
     CX = 0
    labelDebutBoucle:
     AL = [SI]
     Comparer AL à 0
     Si différent aller à labelFinBoucle
     CX = CX+1
     SI = SI+1
     aller à labelDebutBoucle
    labelFinBoucle:
     ici, CX contient la longueur de la chaîne, sans compter le caractère nul final
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  11. #11
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    si tu utilise le registre "si" pour pointer l'adresse de ta chaîne, tu peux utiliser LODS
    ça lit la valeur (ici un octet) et incrémente SI pour pointer la valeur suivante (ou décrémente, suivant l'état du bit de direction qui se positionne avec STD et CLD )

Discussions similaires

  1. Compter le nombre de 1 dans une chaîne
    Par Arnaudp33x33 dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2016, 20h51
  2. Compter le nombre de séparateurs dans une chaîne saisie
    Par marooh dans le forum x86 16-bits
    Réponses: 2
    Dernier message: 19/11/2010, 14h02
  3. [WD12]Compter le nombre de caractère d'une chaîne
    Par Deallyra dans le forum WinDev
    Réponses: 10
    Dernier message: 07/03/2008, 16h05
  4. Réponses: 4
    Dernier message: 05/05/2006, 23h52
  5. Compter le nombre de caractère d'une chaîne
    Par kespy13 dans le forum Langage
    Réponses: 3
    Dernier message: 19/04/2006, 18h04

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