Petit problème pour comparer (cmp) [Résolu]

Messages postés
4
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
10 mars 2008
- - Dernière réponse : BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- 23 févr. 2008 à 20:05
Bonjour à tous,

Pour commencer, j'espère de ne pas avoir choisis le mauvais lieu pour poster, j'ai un petit peu hésité
Donc, j'ai décidé d'apprendre l'assembleur et j'ai fait un petit "vérificateur de mot de passe" trés basique et le problème est que mon code me renvoie toujours NO, je pense que cela se joue sur une mauvaise utilisation de cmp :

SECTION .data
        mdp     db      '123'
        bon     db      'OK', 10
        bad     db      'NO', 10
        wel     db      'Entrez votre mdp : '
        welen   equ     $-wel
        buflen  db      1024

SECTION .bss
        buf     resb    1024

SECTION .text
        GLOBAL _start

_start:

        mov     edx, welen
        mov     ecx, wel
        mov     ebx, 1
        mov     eax, 4
        int     80h

        mov     edx, buflen
        mov     ecx, buf
        mov     ebx, 0
        mov     eax, 3
        int     80h

        mov     eax, [buf]
        cmp     eax, mdp
        je        cest_bon
        mov     edx, 3
        mov     ecx, bad
        mov     ebx, 1
        mov     eax, 4
        int       80h
        jmp     exit

        cest_bon:
        mov     edx, 3
        mov     ecx, bon
        mov     ebx, 1
        mov     eax, 4
        int        80h

       exit:
         mov      ebx, 0
          mov      eax, 1
          int         80h

EDIT : Je suis sous Linux et CPU : i686 mais bon je pense que c'est surtout une erreur d'écriture et je tiens à préciser que je n'ai aucune erreur avec nasm et ld...

Merci
Afficher la suite 

9 réponses

Meilleure réponse
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
3
Merci
Salut,

  commenter son code peut aider à diagnostiquer ;)
ex :
    ; écriture de 'Entrez votre mdp : ' sur la console (eax:4 -> sys_write , ebx:1 -> stdout)
       mov     edx, welen
        mov     ecx, wel
        mov     ebx, 1
        mov     eax, 4
        int     80h

    ; lecture du mot de passe (eax:3 -> sys_read, ebx:0 -> stdin)
        mov     edx, buflen
        mov     ecx, buf
        mov     ebx, 0
        mov     eax, 3
        int     80h

    ; on recopie les 4 1ers octets de la chaine buf en LSB (ordre des octets inversés) dans eax
        mov     eax, [buf]
    ; on compare ce mot de 32bits avec l'adresse du texte '123'
        cmp     eax, mdp

    ; si ils sont identiques (ce que je doute fort en comparant 4octets
    ; d'un texte et une adresse), alors on va l'affichage de "OK"
        je        cest_bon

    ; on affiche 'NO'
        mov     edx, 3
        mov     ecx, bad
        mov     ebx, 1
        mov     eax, 4
        int       80h

    ; on va quitter le prog
        jmp     exit

        cest_bon:
    ; on affiche 'OK'

        mov     edx, 3
        mov     ecx, bon
        mov     ebx, 1
        mov     eax, 4
        int        80h

    ; on quitte le prog
       exit:
       mov      ebx, 0
       mov      eax, 1
       int         80h

Bon ben après une simple analyse, je pense que ça a l'air évident :)
Il n'y a aucune chance pour que tes 4 octets de "buf" soient identique à une adresse.

Première correction : changer "cmp     eax, mdp" par "cmp     eax, [mdp]" (pour comparer les 4 1ers octets de 'buf' aux 4 1ers octets de 'mdp').

Ensuite, le problème c'est que de cette manière tu compares 4 octets (pas un de plus, pas un de moins !)... Donc si tu veux garder cette simplicité, il te faut restreindre la saisie à 4 caractères, et utiliser un mot de passe
de 4 caractères (exemple : "mdp     db      '1234'").

++dune2

Gentoo... que du bonheur ...

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 207 internautes nous ont dit merci ce mois-ci

Commenter la réponse de _dune2_
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
Bonjour,

Comme te le fait remarquer _dune2_ ton problème réside dans le fait que tu compare ton mot de passe à une adresse. Tu peux également effectuer la comparaison de tes caractères avec l'instruction cmpsb (comparaison octet par octet) ou cmpsd (dword par dword) - mais il faudra avoir un nombre de caractères multiple de 4.
Pour les appels système Linux, je ne sais pas car je débute sur cet OS.

PS: Je suis à la recherche d'infos pour les "api" Linux du style MessageBox de Windows.
Commenter la réponse de cs_Nasman
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
0
Merci
Salut Nasman,
  pour les "api" du style MessageBox sous linux, il faut bien assimiler que sous unix, l'interface graphique est une surcouche à l'OS. Il ne fait donc pas parti des appels systèmes standards.
Pour pouvoir créer et gérer une application graphique, il te faudra utiliser un "toolkit" graphique. Sous linux 2 toolkits sont plutôt bien intégré : gnome et kde.

Tu devras donc passer par une de ces 2 API pour réaliser une interface graphique, et donc te réferer vers leurs documentations respectives :
http://api.kde.org/
ou
http://library.gnome.org/devel/gtk/stable/

++dune2

Gentoo... que du bonheur ...
Commenter la réponse de _dune2_
Messages postés
4
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
10 mars 2008
0
Merci
Merci à vous deux d'avoir pris la peine de répondre, parce que à ce que je vois y'as pas grand monde en assembleur sous linux ici...

@ _dune2_ : Merci, c'est clair qu'aprés avoir pris le temps de commenter j'aurais pu voir mon erreur( ou pas...).

@ Nasman : J'avais déjà vu qu'on pouvait comparer par octet ou dword etc... Mais bon dans les docs en anglais c'est un peu dur à extraire

Si vous avez des cours, ou docs sous linux en francais, anglais, espagnol ou italien je prends (quoique je sais pas si y'en as beaucoup pour linux ^^)

Bonne journée à vous
Commenter la réponse de smok1360
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
0
Merci
re-salut,

 et bien voilà un petit lien qui me semble bien pour vous deux !
http://www.alrj.org/docs/asm/linux-asm.html

Ainsi que :
http://members.save-net.com/jko@save-net.com/asm/h_code_tut.htm
et
http://asm.sourceforge.net/resources.html#tutorials

Gentoo... que du bonheur ...
Commenter la réponse de _dune2_
Messages postés
4
Date d'inscription
mercredi 31 octobre 2007
Statut
Membre
Dernière intervention
10 mars 2008
0
Merci
Merci pour les liens je vais aller voir ça de plus prés...
Commenter la réponse de smok1360
Messages postés
141
Date d'inscription
mercredi 19 juillet 2006
Statut
Membre
Dernière intervention
20 avril 2011
0
Merci
Ensuite, en ce qui concerne l'asm intel à proprement parler, il faut se diriger vers les datasheets intel. Ces documents de références sont gros et sembles confus, mais ce sont des documents de références sur lesquels on se refère pour une instruction en particulier par exemple.
C'est notre sacro-sainte bible du programmeur asm ;)

http://developer.intel.com/products/processor/manuals/index.htm

Gentoo... que du bonheur ...
Commenter la réponse de _dune2_
Messages postés
202
Date d'inscription
mardi 17 mai 2005
Statut
Membre
Dernière intervention
29 septembre 2008
0
Merci
>_dune2_
Merci pour ces infos, j'ai la distribution ubuntu (donc gnome) et malgré mes recherches sur le net, je n'ai pas trouvé grand chose sur l'interface graphique. Je comprend mieux maintenant et je vais regarder la doc sur gnome.

>smok1360
Personnellement j'utilise la documentation fournie avec Nasm et pour la programmation sous windows j'utilisais un fichier win32.hlp (plus trop à jour mais plus commode que msdn).

A+
Commenter la réponse de cs_Nasman
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
13
0
Merci
La version MSDN qu'on installe en local est infiniment plus confortable que sur le net.

ciao...
BruNews, MVP VC++
Commenter la réponse de BruNews