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 :

[MASM] Rechercher une sous-chaîne dans une chaîne de caractères


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 53
    Points
    53
    Par défaut [MASM] Rechercher une sous-chaîne dans une chaîne de caractères
    Rechercher dans une chaîne de caractères.

    Merci d'avance

  2. #2
    Expert confirmé

    Inscrit en
    Août 2006
    Messages
    3 942
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 3 942
    Points : 5 654
    Points
    5 654
    Par défaut
    Gae,

    Et 100 € + 1 mars en plus, ça t'intéresse ?
    Si les cons volaient, il ferait nuit à midi.

  3. #3
    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,

    Rechercher dans une chaine de caractere
    C'est un peu cours comme message pour que l'on puisse t'aider... Avec un message clair tu aurais sûrement déjà pu avoir une réponse précise...

    "Rechercher" quoi dans une chaîne de caractère ? Un seul caractère, une sous-chaîne, le zero terminal, un CRLF, etc. ?

    Quel assembleur (x86, ARM, ...) ? quel programme d'assemblage (MASM, Gas) ? quelle syntaxe ?

  4. #4
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    Bonjour,



    C'est un peu cours comme message pour que l'on puisse t'aider... Avec un message clair tu aurais sûrement déjà pu avoir une réponse précise...

    "Rechercher" quoi dans une chaîne de caractère ? Un seul caractère, une sous-chaîne, le zero terminal, un CRLF, etc. ?

    Quel assembleur (x86, ARM, ...) ? quel programme d'assemblage (MASM, Gas) ? quelle syntaxe ?
    Merci bcp Mon ami

    Rechercher une sous-chaîne dans une chaine de caractère svp x86 MASM

  5. #5
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 234
    Points : 2 338
    Points
    2 338
    Par défaut
    Citation Envoyé par droggo Voir le message
    Gae,

    Et 100 € + 1 mars en plus, ça t'intéresse ?
    Dit autrement :
    Tu ne voudrais pas que quelqu'un te fasse ton exo, par hasard ?

    NB : tu n'es pas non plus obligé d'écrire en gros caractères gras.
    « Un peuple qui est prêt à sacrifier un peu de liberté contre un peu de sécurité, ne mérite ni l'une, ni l'autre, et finira par perdre les deux. »
    Attribué indistinctement à :
    Thomas Jefferson
    Benjamin Franklin
    Albert Einstein !

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

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Au moins il annonce clairement la couleur

    Tu as l'instruction CMPS qui permet de comparer le contenu de DS:SI et ESI

    Elle peut-etre precedee de "repnz" par exemple avec la longueur a comparer
    dans CX.

    Enfin, cherches un peu, tu vas trouver

    a+ Francois (qui aide un peu mais pas trop )

  7. #7
    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
    La solution de facilité avec MASM32

    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
    25
    26
    27
    28
    29
     
    .686
    .xmm
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
    ASSUME FS:NOTHING
     
    include windows.inc
     
    include kernel32.inc
    include user32.inc
    include msvcrt.inc
     
    includelib kernel32.lib
    includelib user32.lib
    includelib msvcrt.lib
     
    .data
    big BYTE "une simple phrase de test",0
    small BYTE "simple phrase",0
     
    .code
    start:
    	invoke crt_strstr, addr big, addr small
    	; ici EAX pointe sur "simple phrase" dans big.
     
    	ret
     
    end start
    Après, pour le faire (implémenter) soi-même, c'est une autre paire de manche. Il suffit de debugger le code de strstr dans le CRT pour s'apercevoir que c'est loin d'être trivial comme exercice (si on veut faire du code vraiment sûr...).

    Il faudrait d'abord écrire l'algo avant de se jeter sur une implémentation, mais là j'avoue que je suis pas vraiment chaud...


    Citation Envoyé par Neitsa Voir le message
    C'est un peu cours...
    Hum... court

    edit : Je suis du même avis que Forthman. De prime abord , j'aurais tendance à chercher la première lettre commune et à faire du CMPSB à répétition, quitte à revenir en arrière... Faut voir à quoi ça mène.

  8. #8
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Neitsa Voir le message
    La solution de facilité avec MASM32

    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
    25
    26
    27
    28
    29
     
    .686
    .xmm
    .model flat, stdcall  ;32 bit memory model
    option casemap :none  ;case sensitive
    ASSUME FS:NOTHING
     
    include windows.inc
     
    include kernel32.inc
    include user32.inc
    include msvcrt.inc
     
    includelib kernel32.lib
    includelib user32.lib
    includelib msvcrt.lib
     
    .data
    big BYTE "une simple phrase de test",0
    small BYTE "simple phrase",0
     
    .code
    start:
    	invoke crt_strstr, addr big, addr small
    	; ici EAX pointe sur "simple phrase" dans big.
     
    	ret
     
    end start
    Après, pour le faire (implémenter) soi-même, c'est une autre paire de manche. Il suffit de debugger le code de strstr dans le CRT pour s'apercevoir que c'est loin d'être trivial comme exercice (si on veut faire du code vraiment sûr...).

    Il faudrait d'abord écrire l'algo avant de se jeter sur une implémentation, mais là j'avoue que je suis pas vraiment chaud...




    Hum... court

    edit : Je suis du même avis que Forthman. De prime abord , j'aurais tendance à chercher la première lettre commune et à faire du CMPSB à répétition, quitte à revenir en arrière... Faut voir à quoi ça mène.
    Merci bcp mon ami

    c genial

    mé j le vx en dos


    mov
    int
    cmp
    .....

    svp

  9. #9
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    beuh,

    c'est vrai, c'est de la triche, utiliser les api et les librairies n'a rien d'ASMique
    voilà, un beau code ecrit sans le moindre bout de papier, du pur asm en direct live:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    farfouiller:
    ;esi=mot a trouver ,0
    ;edi=texte a fouiller ,0
    ;retourne:
    ;ebx=pointeur dans le texte
    ;eax=/=0 alors mot introuvable
            xor ecx,ecx    ; ecx=0
    .init:
            xor edx,edx
            mov al,[esi+edx]
            or al,al
            je .end    ; il n'y a rien a faire
    .findfirst:
            mov ah,[edi+ecx]
            or ah,ah
            je .end    ;il n'y a vraiment rien a faire
            inc ecx
            cmp al,ah
            jne .findfirst
            lea ebx,[edi+ecx-1] ;sauver le pointeur dans le texte
            inc edx
    .next:
            mov al,[esi+edx]
            inc edx
            or al,al
            je .yesss    ;c'est la fin du mot? alors c'est bon
            mov ah,[edi+ecx]
            inc ecx
            or ah,ah
            je .end      ;c'est la fin du texte? alors c'est pas bon
            cmp al,ah
            jne .init     ;c'est pas pareil? alors on recommence 
            jmp .next
    .yesss:
            xor eax,eax
            ret
    .end:
            or eax,1
            ret
    bon, je l'ai pas testé, mais avec quelques mises au point, ça devrait fonctionner.
    ceci est une fonction qui peut-etre utilisée de partout, dans tout les contextes. meme en mode protégé.

  10. #10
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    voilà, la version testée, ça fonctionne reelement, je vien de la tester.
    et a signaler, je n'ai pas utilisé la moindre feuille de papier, ni meme un seul shemas ou diagramme, tout de tete avec de l'experience et un cerveau gros comme mes chevilles.
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
     
    mot db 'blabliblou',0
    texte db 'blablablabpopolabliblibpipiliblibloubcacaloubloublablibloubloubliblublioublurprrrtffrtpouët',0
    ...
    mov esi,mot
    mov edi,texte
    call farfouiller
    ;ici eax  pointe sur 'blabliblou' dans texte
    jc @f
    .ok:
    ...
    @@:
    ...
    ...
    ...
    farfouiller:
    ;esi=mot a trouver ,0
    ;edi=texte a fouiller ,0
    ;retourne:
    ;eax=pointeur dans le texte
    ;cf=1 alors mot introuvable
            xor ecx,ecx    ; ecx=0
    .init:
            xor edx,edx
    @@:
            mov al,[esi+edx]
            inc edx
            or al,al
            je @f    ;c'est la fin du mot? alors c'est bon
            mov ah,[edi+ecx]
            inc ecx
            or ah,ah
            je .end      ;c'est la fin du texte? alors c'est pas bon
            cmp al,ah
            je @b     ;c'est pas pareil? alors on recommence
            jmp .init
    @@:
            sub ecx,edx
            mov eax,ecx
            clc
            ret
    .end:
            stc
            ret     
    code UFO-NOSS edfed
    j'ai meme pu enlever une étape (findfirst: ) completement inutile.

    c'est ecologique, bon, j'ai gaspillé de l'energie electrique ( nucleaire ) pour le faire, mais au moins, je n'ai pas utilisé de papier, un beau geste pour notre chère planète.
    en gros, tu vas avoir une bonne note a ton exam, ça serai cool que tu dise que c'est pas toi qui en est l'auteur, si tu veu des explications, aucun probleme, mais je crois que le code parle de lui meme..

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

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

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Points : 1 905
    Points
    1 905
    Par défaut
    Salut Edfed,

    Pourquoi n'as-tu pas utilise CMPS ?

    a+ Francois

  12. #12
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    pour des raisons de souplesse

    cmps n'est pas capable de comparer trois fois, et que dire de l'addressage limité

  13. #13
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par edfed Voir le message
    beuh,

    c'est vrai, c'est de la triche, utiliser les api et les librairies n'a rien d'ASMique
    voilà, un beau code ecrit sans le moindre bout de papier, du pur asm en direct live:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    farfouiller:
    ;esi=mot a trouver ,0
    ;edi=texte a fouiller ,0
    ;retourne:
    ;ebx=pointeur dans le texte
    ;eax=/=0 alors mot introuvable
            xor ecx,ecx    ; ecx=0
    .init:
            xor edx,edx
            mov al,[esi+edx]
            or al,al
            je .end    ; il n'y a rien a faire
    .findfirst:
            mov ah,[edi+ecx]
            or ah,ah
            je .end    ;il n'y a vraiment rien a faire
            inc ecx
            cmp al,ah
            jne .findfirst
            lea ebx,[edi+ecx-1] ;sauver le pointeur dans le texte
            inc edx
    .next:
            mov al,[esi+edx]
            inc edx
            or al,al
            je .yesss    ;c'est la fin du mot? alors c'est bon
            mov ah,[edi+ecx]
            inc ecx
            or ah,ah
            je .end      ;c'est la fin du texte? alors c'est pas bon
            cmp al,ah
            jne .init     ;c'est pas pareil? alors on recommence 
            jmp .next
    .yesss:
            xor eax,eax
            ret
    .end:
            or eax,1
            ret
    bon, je l'ai pas testé, mais avec quelques mises au point, ça devrait fonctionner.
    ceci est une fonction qui peut-etre utilisée de partout, dans tout les contextes. meme en mode protégé.


    Merci bcp
    est c q ca marche avec assembleur 16 bit ???

  14. #14
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    si le processeur est un 386+, ça marche (quel que soit le mode), sinon, il faut adapter au 16 bits, ce qui n'est pas tres dur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    ;mov al,[esi+ecx]
    mov al,[si+bx]
    ;mov ah,[edi+edx]
    mov ah,[di+bx]
    car le 16 bit ne supporte pas grand chose.

  15. #15
    Membre du Club
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Mars 2007
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2007
    Messages : 42
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par edfed Voir le message
    si le processeur est un 386+, ça marche (quel que soit le mode), sinon, il faut adapter au 16 bits, ce qui n'est pas tres dur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    ;mov al,[esi+ecx]
    mov al,[si+bx]
    ;mov ah,[edi+edx]
    mov ah,[di+bx]
    car le 16 bit ne supporte pas grand chose.
    Merci bcp ..

    j ss tres content

  16. #16
    Membre éclairé
    Avatar de edfed
    Profil pro
    être humain
    Inscrit en
    Décembre 2007
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : être humain

    Informations forums :
    Inscription : Décembre 2007
    Messages : 476
    Points : 701
    Points
    701
    Billets dans le blog
    1
    Par défaut
    excuse, il y a erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mov al,[si+bp]
    mov ah,[di+bx]

  17. #17
    Membre confirmé Avatar de dapounet
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2007
    Messages : 469
    Points : 567
    Points
    567
    Par défaut
    Citation Envoyé par Forthman Voir le message
    Salut Edfed,

    Pourquoi n'as-tu pas utilise CMPS ?

    a+ Francois
    Les instructions de chaîne sont trop lentes sur les processeurs modernes à part REP MOVS et REP STOS pour les grosses copies mémoire. Personnellement j'ai toujours fait moins d'erreurs avec les instructions élémentaires, mais c'est peut-être parce que je ne les ai pas vues aux cours et que j'ai dû apprendre à faire sans.
    :wq

Discussions similaires

  1. Réponses: 6
    Dernier message: 13/11/2009, 16h06
  2. [RegEx] Sous-chaîne dans une sous-chaîne : optimisation RegExp
    Par mathieugamin dans le forum Langage
    Réponses: 3
    Dernier message: 17/12/2007, 08h44
  3. Recherche d'une chaîne dans une sous chaîne
    Par teen6517 dans le forum Langage
    Réponses: 3
    Dernier message: 29/03/2007, 19h10
  4. Rechercher une sous chaine dans une chaine
    Par annedjomo dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 04/02/2005, 10h36
  5. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39

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