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 :

Probleme valeur retour fonction


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #21
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Normal qu'il ne sorte pas 1, vu que tous les tests sont faux
    Je ne pense pas j'avais fait la meme fonction en asm 64bit sur un mac et les test fonctionner correctement.

    Ensuite c'est pas possible que ça te sorte autre que 1 si tu met en comment
    c'est parce que j ai ce comportement bizarre et inexplicable que je cherche de l aide.

    et j ai fait un copier coller de ton code rien n'y change j'ai 16384 en sortie, c'est incompreensible

  2. #22
    Invité
    Invité(e)
    Par défaut
    Bizarre, si j'exécute mon code, il marche

    Ben tu sais quoi, je vais reproduire ton projet et on verra bien.

    Tu travaille sous quel IDE ? (pour l'uplaod)

  3. #23
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    merci bien

    J'utilise vim et nasm/gcc pour la compilation.

  4. #24
    Invité
    Invité(e)
    Par défaut
    Voilà, tout marche (enfin chez moi):

    ASM:
    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
     
    global _isprint
     
    _isprint:
            xor     eax, eax
     
            cmp     [esp], dword ' '
            jb      no
     
            cmp     [esp], dword '~'
            ja      no
     
            mov    eax, 1
            no:
    ret
    compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nasm -f win32 source.asm
    ar rvs isprint.a source.obj
    Enfaite il fallait faire un dword et non pas un byte, car le passage de parameter se fait dword after dword ^^

    C:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    #include <stdio.h>
     
    int     isprint(int c);
     
    int         main(void)
    {
        int     tmp;
     
        tmp = isprint('V');
        printf("%d\n", tmp);
     
        return (0);
    }
    compile:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    gcc.exe -Wall -c source.c -o obj\source.o
    g++.exe  -o bin\test.exe obj\source.o   lib\isprint.a
    Dernière modification par Invité ; 06/05/2015 à 20h40.

  5. #25
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Merci de te donner autant de mal, mais j ai beau essayer et resseyer rien a faire j'ai toujours 16384.
    Faut que j essaye avec un autre pc pour voir.

  6. #26
    Invité
    Invité(e)
    Par défaut
    Pas de soucis ^^

    J'aime aider les personnes et plus quant elles font de l'assembleur

    Bon je vais sortir une théorie folle:

    - La faute au mutli-tasking system, apparemment elle ne se fait pas bien, c'est-à-dire qu'elle ne restaure pas le registre eax comme il faut (et donc il garde la valeur précédente, mais alors pourquoi toujours la même valeur :o) quand ton programme est exécuté (instruction par instruction)

    (Troll: essaye avec windows )

  7. #27
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Bon apres test sur un mac 64 bit.

    Ce code fait un segmentation fault:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    global _isprint
     
    _isprint:
            xor     eax, eax
            cmp     [esp], dword ' '
            jb      no
            cmp     [esp], dword '~'
            ja      no
            mov    eax, 1
    no:   ret
    Ce code fonctionne parfaitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    global _isprint
     
    _isprint:	xor		eax, eax
    			cmp		edi, ' '
    			jb		no
    			cmp		edi, '~'
    			ja		no
    			mov		eax, 1
    no:			ret
    On dirait que c'est mon pc qui merde, sa a l air de marcher partout sauf sur le mien possible?

  8. #28
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    Citation Envoyé par shaynox Voir le message
    Bon je vais sortir une théorie folle:
    - La faute au mutli-tasking system, apparemment elle ne se fait pas bien, c'est-à-dire qu'elle ne restaure pas le registre eax comme il faut
    ouai je te confirme que c'est complètement fumeux comme explication (j'imagine que c'était pour plaisanter )

    Citation Envoyé par punkydev Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    (...)
    	mov	DWORD PTR [esp], 65
    	call	isprint
    (...)
    ce truc là montre que dans ton main() le paramètre de ta fonction isprint() est passé par la pile, donc dans ta fonction isprint() tu dois récupérer le paramètre sur la pile et non depuis edi directement.
    c'est tout le propos de la convention d'appel, en l'occurrence c'est du CDECL (aka "C DECLaration")

    par ailleurs la convention d'appel CDECL précise que c'est à la fonction appelante de sauver les registres eax, ecx et edx, tandis que les autres registres sont à la charge de la fonction appelée, du coup on préfèrera utiliser edx à la place de edi

    aussi on part du principe qu'une fonction qui réussit retourne 0 et une fonction qui échoue retourne -1

    enfin -et comme le montrait le tableau qu'a mis shaynox un peu avant dans la discussion- ce n'est pas un jg qui convient ici mais un ja du fait de la "signedness", un caractère est printable si il est au dessus de 0x20 et en dessous de 0x80, avec 0x80 on touche déjà au bit de signe...

    du coup ta fonction _isprint doit ressembler à quelque chose comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    global _isprint
     
    _isprint:
            mov eax, -1
            xor edx, edx
            mov dl, [esp+4]  ; on va rechercher le paramètre passé à la fonction là où il est, sachant que suite au call le saved eip est stocké juste avant
            cmp dl, 0x20
            jb no
            cmp dl, 0x7f
            ja no
            xor eax, eax
    no:
            ret
    la fonction main utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include <stdio.h>
     
    extern int _isprint (char);
     
    int main (void) {
            printf ("retour = %d\n", _isprint('A'));
            return 0;
    }
    et enfin ne pas oublier que sous linux on dispose de gdb si besoin, il suffit pour ça de passer le switch qui va bien au compilateur
    la chaine de compilation utilisée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nasm -Wall -ggdb -f elf isprint.asm
    gcc -Wall -ggdb -o pouet main.c isprint.o

  9. #29
    Invité
    Invité(e)
    Par défaut

    ouai je te confirme que c'est complètement fumeux comme explication (j'imagine que c'était pour plaisanter )
    Sais ton jamais ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CDECL (aka "C DECLaration")
    Tiens, connaissais pas son acronyme, merci ^^

    @punkydev, ah oui naturellement j'ai oublié que la fonction call sauvegarder l'adresse qui se trouve à la fin du call fonction et donc alloue pour ça 4 octets.

    Donc comme as dit BufferBob, ça serait plutôt un [esp + 4].

    Fait ch*** la pile ...

  10. #30
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Cela marche mille merci

    Le souci vener que dans le main j'appelai la fonction isprint au lieux de _isprint.
    Du coup une question me vient: pourquoi dans les deux cas l'appel a la fonction marche? mais cela differe les resultats.

  11. #31
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par punkydev Voir le message
    Du coup une question me vient: pourquoi dans les deux cas l'appel a la fonction marche? mais cela differe les resultats.
    parce que la fonction isprint() existe déjà dans la libc http://man.developpez.com/man3/isalpha/

  12. #32
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    parce que la fonction isprint() existe déjà dans la libc
    Evidement que je suis bete

    Tant que j'y suis savez-vous si il es possible de compiler sans inclure les librairies qui sont compiler par defaut avec notre programme? (compiler juste notre programme sans rien d'autre que ce qu'on lui donne)

    merci d'avance

  13. #33
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par punkydev Voir le message
    Tant que j'y suis savez-vous si il es possible de compiler sans inclure les librairies qui sont compiler par defaut avec notre programme? (compiler juste notre programme sans rien d'autre que ce qu'on lui donne)
    gcc -nostdlib ? il faudra pas oublier que dans ce cas la fonction de départ est _start et pas main
    c'était facile à trouver en cherchant dans le man gcc cela dit

  14. #34
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2015
    Messages : 38
    Points : 15
    Points
    15
    Par défaut
    Merci pour l'astuce

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. concat probleme valeur retour
    Par fasyr dans le forum Requêtes
    Réponses: 3
    Dernier message: 15/05/2012, 14h04
  2. traiter valeurs retour fonction explode
    Par ju0123456789 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 21/05/2010, 11h25
  3. Réponses: 7
    Dernier message: 10/09/2009, 15h00
  4. [HTML] Probleme valeur de retour checkbox
    Par krony dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 29/11/2005, 14h59
  5. Probleme valeur de parametre dans une fonction
    Par TitouLolo dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 19/05/2005, 13h56

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