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 :

Comparaison de chaînes


Sujet :

Assembleur

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut Comparaison de chaînes
    Bonjour,
    Dans le cadre du développement de mon OS j'ai écrit une fonction strcm pour comparer deux chaînes et ainsi pouvoir lancer mes fonctions
    Ici msgRecup fait référence à mon buffer récupéré au clavier
    J'avais fait au prealable un test d'affichage et en [ebp+8] j'ai bien mon paramètre de pile une des chaines à comparer et msgRecup s'affiche aussi correctement.
    Mon problème vient du fait que la comparaison ne fonctionne pas; de plus il semble qu'il y ait une boucle infinie qui se génère au niveau de mon programme vu qu'en le testant il m'affiche brièvement le message d'erreur et mon shell revient dans l'état où il etait. Il devrait marquer le msg d'erreur et ensuite un nouveau prompt devrait apparaître vu qu'une fois que j'ai appellé ma fonction verifFonction je rappelle mon shell

    voici 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    cpt1 :db 0
    cpt2 :db 0
    boolOk :db 0
    msgErreur: db 'Fonction non reconnue par le systeme',10,0
    version: db 'version',10,0
    msgTest1: db 'version',10,0
    msgTest2: db 'ls',10,0
    mov byte [cpt1],0
    mov byte [cpt2],0
    mov byte [boolOk],0
     
    _verifChaine:
    	push ebp 
     
    	mov ebp,esp		;On met esp dans ebp 
     
    	push eax 
    	push ebx 
    	push ecx 
    	push edx 
    	push esi 
    	push edi 
    	push ds 
    	push es 
     
    	xor eax,eax
    	xor edx,edx
     
     
    	mov esi,[ebp+8]
    	mov byte al,[esi]
     
    	xor bx,bx
    	mov bx,msgRecup
    	add bx,[cpt2]
    	mov byte dl,[bx]
     
    	jmp _suiteVerif
    _errVerif:
    	mov byte [cpt1],0
    	mov byte [cpt2],0
    	mov al,0x4
    	call _couleur
    	mov eax,2
    	mov esi,msgErreur
    	int 0x80
    	mov byte [boolOk],0
    	mov al,0x7
    	call _couleur
    	jmp _finVerif	
     
    _suiteVerif:
    	cmp al,dl
    	jne _errVerif
    	cmp al,0
    	je _fonctionOk
    	inc byte [cpt1]
    	inc byte [cpt2]
    	mov bx,msgRecup
    	add bx,[cpt2]
    	mov byte dl,[bx]
    	add esi,[cpt1]
    	mov byte al,[esi]
    	jmp _suiteVerif
     
    _fonctionOk:
    	mov byte [boolOk],1
     
     
    _finVerif:
    	pop esi
    	pop esi
    	pop es 
    	pop ds 
    	pop edi 
    	pop esi 
    	pop edx 
    	pop ecx 
    	pop ebx 
    	pop eax 
    	pop ebp 
    	ret
     
    _verifFonction:
    	_verifversion:
    		push version
    		call _verifChaine
    		mov cx,[boolOk]
    		cmp cx,1
    		je _runVersion
    		mov byte [boolOk],0
    		jmp _vls
    	_runVersion:
    		mov byte [boolOk],0
    		call _version
    		jmp _finFonction
    	_vls
    		push msgTest2
    		call _verifChaine
    		jmp _finFonction
    _finFonction:
    	ret

  2. #2
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Tu as pas l'impression de faire un concours de destruction de pile ?

    Pushad /Popad c'est pas mal aussi et ça évite de te mélanger les pinceaux...


    push ebp
    mov ebp esp

    ... code

    mov esp ebp
    pop ebp
    ret

    des push /pop ne sont pas symétriques...

    Donc déjà une pile en état c'est bien.
    @+WO

  3. #3
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Je n'ai aucun probleme au niveau de mes parametres ils sont ok

  4. #4
    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 : 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
    Points : 1 905
    Points
    1 905
    Par défaut
    Il veut dire que les valeurs des registes se melange

    Il faut faire attention de bien faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PUSH eax
    PUSH ebx
    ...
    POP ebx
    POP eax
    et pas

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    PUSH eax
    PUSH ebx
    ...
    POP eax
    POP ebx
    ne pas oublier quand tu es dans une boucle etc...

    Et puis entre nous, j'ai un peu de mal a lire ta "soupe"
    (oups ! je crois que je l'ai vexe )

    Mais je te pardonne car c'est pas evident de debuter en ASM

    a+ Francois

  5. #5
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Si tu connais une autre methode pour comparer leschaines je suis preneur
    En fait c opur un projet on est plusieurs mais je suis un dé seul à bosser dessus et le temps presse et comme je debut een asm voila

  6. #6
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Pour comparer deux contenus il y a de nombreuses méthodes...

    Pour lancer tes fonctions dont je ne connais pas les noms ni l'organisation ASCII il faudrait un peu plus d'infos...

    tu peux travailler sur des DWORD pour la recherche (tri) rapide (si tes fonctions son correctement prototypées) et sur des bytes si c'est vraiment le souc...
    Tu peux aussi faire des tables d'adresses pour tes call fonction où chaque fonction est représenté par un ID indentifié par des "nombres" ASCII.

    La vitesse, la place, la structure objet... qu'est-ce qui est important dans votre projet ?

    @+WO

  7. #7
    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 : 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
    Points : 1 905
    Points
    1 905
    Par défaut
    Tu as aussi l'instruction CMPS qui compare 2 chaines
    La premiere se trouve en DS:[SI]
    et la deuxieme en ES:[DI]
    CX=nombre de cellules a comparer (byte, word ou dword)
    donc ici CX=octets

    une fois que tu as initialise tes registres, tu peux faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Repnz byte CMPS ; compare CX octets
    jne Pas_identique ; saute a Pas_identique si une difference est trouvee
    ... ; suite si identique
    Je trouve cette solution assez simple et "lisible"

    a+ Francois

  8. #8
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    bien sur... mais tu ne travailles que sur des bytes et la stratégie n'est toujours pas définie...

    Donc, les solutions aux problèmes non posés c'est un peu délicat

    @+WO

  9. #9
    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 : 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
    Points : 1 905
    Points
    1 905
    Par défaut
    Je ne vois pas ou est le probleme, il a defini ses chaines comme ca
    maintenant, si il veut comparer mot par mot (16bits donc)
    il n'a qua faire un rep word cmps ...
    maintenant, s'il a des attributs de couleur en // sur sa chaine, et qu'il
    ne veut comparer que la chaine ... effectivement il ne pourra pas utiliser
    cette methode ...
    ou encore s'il veut que la chaine "VACHE" = "vache" il y a un travail de
    conversion de chaine, mais je prefere faire la conversion "avant" la
    comparaison (chacun a ses petites habitudes )

    a+ Francois

  10. #10
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Je pense qu'il n'y a que lui qui puisse répondre à la question stratégique

    Sinon, effectivement, tu ne verras pas le problème

    @+WO

    PS: Tu avances comme tu veux (Francois) ?

  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 : 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
    Points : 1 905
    Points
    1 905
    Par défaut
    Mode HS on :
    J'avance doucement le matin et pas trop vite le soir
    j'ai pas encore eu le temps de regarder
    merci
    Mode HS OFF

    a+ Francois

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2004
    Messages
    138
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 138
    Points : 45
    Points
    45
    Par défaut
    Mes fonctions etait bonne
    Le hic c'est que lors de l'appelle je push mon param et je ne lo popé pa
    Et mon noyau etait trop gros par rapport a ce ke le boot loader devait charger
    RRRRRRRRR l'asm lol
    Merci

  13. #13
    WO
    WO est déconnecté
    Inactif
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 88
    Points : 107
    Points
    107
    Par défaut
    Donc,
    l'ASM c'est cool mais ta pile était pourrie
    quand à la taille de ton prog elle serait ramenée à sa partie congrue si tu utilisais des tables de sauts qui servent aussi au tri...

    @+WO

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

Discussions similaires

  1. Charset variable, comparaison de chaînes
    Par TNorth dans le forum Langage
    Réponses: 2
    Dernier message: 28/02/2007, 11h31
  2. [Excel-VBA] Pb de comparaison de chaîne de caractères
    Par tangjuncn dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 26/02/2007, 12h50
  3. [String] Comparaison de chaînes ?
    Par toto019 dans le forum Langage
    Réponses: 4
    Dernier message: 21/07/2006, 23h18
  4. Comparaison de chaîne (avec pourcentage ou...)
    Par yves232 dans le forum Langage
    Réponses: 4
    Dernier message: 26/04/2006, 17h23
  5. MySQL, et les comparaisons de chaînes en cyrillique, Chinois
    Par SuperCed dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 15/12/2005, 15h24

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