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 :

Memset qui ne fonctionne pas correctement


Sujet :

Assembleur

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Par défaut Memset qui ne fonctionne pas correctement
    Bonjour,
    je suis entrain d'apprendre l'assembleur et je refais quelques fonction de la libc en asm.
    je souhaite refaire la fonction memset avec le prototype suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void *memset(void *s, int c, size_t n);
    voila ma fonction

    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
    [BITS 64]
    section .txt
            ;; déclaration des symboles          
            global memset
    memset:
            xor rax, rax            ;i = 0       
            mov r8b, [rdi]
    boucle:
            mov rdi , rsi
            cmp rax, rdx
            jz end
            inc rdi
            inc rax
            jmp boucle
    end:
            ret
    Je ne comprend pas d'ou vient le probleme. la fonction ne fais rien. le pointeur passé en parametre n'est pas memset du tout
    pouvez vous m'aider ? merci d'avance

  2. #2
    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
    Pour commencer, je ne vois dans ta fonction aucune récupération des paramètres. Ensuite, aucune de tes instructions n'écrivent quoi que ce soit en mémoire, et là tant mieux car écrire n'importe où=segfault assuré.
    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

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 227
    Par défaut
    normalement les parametres sont respectivement dans rdi , rsi et rdx ...
    comment je fais pour les récupérer en asm ?

  4. #4
    Expert confirmé
    Avatar de Kannagi
    Homme Profil pro
    cyber-paléontologue
    Inscrit en
    Mai 2010
    Messages
    3 226
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cyber-paléontologue

    Informations forums :
    Inscription : Mai 2010
    Messages : 3 226
    Par défaut
    Citation Envoyé par vodkline Voir le message
    normalement les parametres sont respectivement dans rdi , rsi et rdx ...
    Elle ne rentre as dedans par magie non plus :p

    Citation Envoyé par vodkline Voir le message
    comment je fais pour les récupérer en asm ?
    La ça serait plutôt "comment on récupère les paramétres d'une fonction appelé en C en asm".
    Si tu l'aurait écrit en full asm ton programme, la question se oserait beaucoup moins

    Avec push/pop normalement (chrtophe confirmera et/ou expliquera cela plus en détaille).

  5. #5
    Membre chevronné
    Homme Profil pro
    .
    Inscrit en
    Juin 2002
    Messages
    239
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : .
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2002
    Messages : 239
    Par défaut
    Bonjour.

    La question essentielle à se poser est : quelle est la convention d'appel de cette fonction ?

    Sachant que le code montré par vodkline est du 64 bits, la convention d'appel est certainement du type fastcall :
    les premiers paramètres sont passés par les registres.

    Il ne faut donc pas aller les chercher sur la pile ...

    Il ne reste plus qu'à consulter la documentation pour savoir quels sont les paramètres utilisés et dans quel ordre.

    Sous Windows, ce sont rcx, rdx, r8, r9.
    Sous Linux, ce sont rdi, rsi, rdx, rcx, r8, r9.

    Voir : https://en.wikipedia.org/wiki/X86_calling_conventions , vers le bas de la page.

    Si vodkline programme sous Linux, il a parfaitement raison lorsqu'il écrit
    normalement les parametres sont respectivement dans rdi , rsi et rdx ...
    Par contre, son code n'a aucun sens.

  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
    normalement les parametres sont respectivement dans rdi , rsi et rdx ...
    Ah oui c'est vrai autant pour moi.

    memset va copier x fois un caractère à partir de l'adresse fournie.

    Sans optimisation, un simple suffira avec=caractère à copier, rcx nombre de copie, edi adresse ou commencer l'écriture

    Tu peux aussi créer un code C avec la fonction et demander à gcc de te faire le code assembleur pour l'analyser :
    Par contre le source sera en notation at&t.

    Sinon avec gdb, tu tapes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    set disassembly-flavor intel
    et le code s'affichera en notation Intel
    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

Discussions similaires

  1. Application qui ne fonctionne pas correctement sur W7 64 bits
    Par JeanMarc_T2k dans le forum Windows 7
    Réponses: 6
    Dernier message: 22/03/2011, 11h34
  2. Réponses: 13
    Dernier message: 09/01/2011, 23h33
  3. [CSS 2.1] Menu qui ne fonctionne pas correctement avec IE
    Par beegees dans le forum Mise en page CSS
    Réponses: 0
    Dernier message: 13/10/2010, 10h37
  4. Réponses: 2
    Dernier message: 02/01/2010, 12h52
  5. Un test if qui ne fonctionne pas correctement
    Par Shinjuku dans le forum Langage
    Réponses: 6
    Dernier message: 26/02/2008, 10h52

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