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 :

[NASM] Problème de variable dans la fonction appelante


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut [NASM] Problème de variable dans la fonction appelante
    Bonjour,

    Je débute actuellement en asm et j'ai un soucis pour utiliser ma fonction asm dans un programme en c

    global ma_fonction

    section .text

    ma_fonction
    push ebp
    mov ebp, esp

    mov ebx, [ebp + 8]
    leave
    ret
    extern int my_fonction(char *);

    int main(int argc, char **argv)
    {
    printf("avant : %i %p\n", argc, &argc);
    ma_fonction(argv[1]);
    printf("apres : %i %p\n", argc, &argc);
    }
    Ceci m'affiche :
    avant : 3 0xbfbfebf0
    apres : 875770417 0xbfbfed17
    Comme vous pouvez le voir, les arguments de mon main ont été modifiés et je ne comprends pas pourquoi.

    Merci d'avance

  2. #2
    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
    Bonjour,

    Quand une fonction est appelée, elle ne peut pas avoir modifié EBX. Si tu as vraiment besoin de l'utiliser, sauvegarde-le sur la pile avant et restaure-le à la fin de la fonction.
    Si ce n'est pas ça vérifie que LEAVE fait bien l'équivalent de POP EBP et ne dépend pas de quelque chose que tu n'aurais pas fait au début de la fonction.
    :wq

  3. #3
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Enter / Leave serait plus clair et te permettrait de gérer plus clairement ta (la) pile.
    Ceci dit, ce couple est plutôt une concession aux HLL qu'autre chose ; l'éviter serait donc un "meilleur" début, en tout cas, pas de "mélange", tu le regretteras dans quelques mois à la relecture...

    Effectivement, utiliser ebx qui est un registre protégé, n'est pas la meilleure chose: Un retour dans eax t'évitera des surprises (surtout comme tu passes et récupères les arguments (ce n'est pas une critique, juste un fait)).

    Tu peux simplement commencer par une classique forme C-Like:

    MaFonction:

    mov eax [esp+8] (récupération de l'argument)

    ret 4 (pour restaurer le cadre de pile)

    Le fait de travailler avec esp n'est cependant pas une bonne habitude: En cas de push / pop, tu devras décaler tous tes offsets sur la pile et cela devient très compliquer à gérer proprement.
    L'intérêt d'utiliser ebp, comme tu le fais, est de pouvoir travailler localement sur la pile (offset négatifs) et recevoir des arguments (offsets positifs + 4(Lp -> adresse de retour))

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Je vous remercie, avec eax cela marche parfaitement

    Je pensais que ebx, ecx et edx pouvaient être utilisé librement
    Est ce que vous connaissez la liste des registres pouvant être utilisés comme variable ?

    merci d'avance

  5. #5
    Membre actif

    Inscrit en
    Février 2009
    Messages
    200
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 200
    Points : 235
    Points
    235
    Par défaut
    Tu peux quasiment tout utiliser de eax à esi sans problèmes.
    Simplement, sous OS Microsoft quelques conventions:

    ebx edi esi ebp esp doit être restaurés dans leurs états initiaux (ceux qu'ils avaient au moment de l'appel).

    L'utilisation ebp/esp en tant que registre généraux est un peu plus complexe car tu bouleverses la pile et modifie des informations nécessaires au déroulement linéaire de ton code. Il arrive cependant de les modifier pour des besoins très spécifiques.

    Eax (Accumulator)est principalement utilisé pour les retours de flags ou de Lp

    Ecx (Count) est utilisé comme compteur dans des instructions comme repne, pour les rotations...

    Edx (Data) est utilisé dans les calculs 32 bits (mul, div..) pour les dépassements 64bits et modulo

    Ebx (Base) il est donc protégé lors des appels des diverses API et utilisé par convention comme base (respectée par les Matiens...)

    Esi et Edi sont utilisés dans la gestion des tables, principalement les chaînes: Esi étant source et Edi destination Ecx comme compteur d'itération et Eax comme registre de chargement bidirectionel
    Esi et Edi sont, comme Ebx protégés lors des appels d'API (ou COM etc.).

    Le plus simple, comme d'habitude, c'est de lire la doc et de faire des essais avec un débug et des points d'arrêt.

Discussions similaires

  1. Réponses: 1
    Dernier message: 26/02/2015, 12h42
  2. [PowerShell] Problème de variable dans les fonctions. (windows forms)
    Par gretch dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 20/08/2014, 15h02
  3. Problème de variables dans fonction
    Par Vanessa48 dans le forum Langage
    Réponses: 10
    Dernier message: 03/10/2011, 15h31
  4. problème de variable dans une fonction
    Par K4trix dans le forum C
    Réponses: 9
    Dernier message: 06/07/2006, 09h38
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 13h13

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