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 16-bits Assembleur Discussion :

[NASM] Variables locales à une fonction


Sujet :

x86 16-bits Assembleur

  1. #1
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut [NASM] Variables locales à une fonction
    Bonjour,

    Simplement, y a t il moyen de créer des variables locales à une fonction en nasm ? De façon à ce que différentes variables du programme puissent avoir le même nom, et que une variable interne à une fonction ne soit utilisable que dans cette fonction ? Si oui, comment déclarer et utiliser ce genre de variable ?

    D'avance merci.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 400
    Points : 23 785
    Points
    23 785
    Par défaut
    Citation Envoyé par Rémiz Voir le message
    Simplement, y a t il moyen de créer des variables locales à une fonction en nasm ? De façon à ce que différentes variables du programme puissent avoir le même nom, et que une variable interne à une fonction ne soit utilisable que dans cette fonction ? Si oui, comment déclarer et utiliser ce genre de variable ?
    Oui, les variables locales du C, par exemple, sont implémentées en utilisant la pile. À toi de la manipuler correctement pour exploiter l'espace qu'elle occupe. Note qu'à ce niveau de programmation, la variable locale est une notion comme une autre.

    Il n'y a pas, à ma connaissance de directive spéciale sous nasm pour définir explicitement une variable locale. Par contre, tu peux définir des étiquettes et des macros locales à ton contexte :

    http://www.posix.nl/linuxassembly/na...ml#section-3.8
    http://www.posix.nl/linuxassembly/na...#section-4.6.2
    http://www.posix.nl/linuxassembly/na...#section-4.6.3

    Le principe de la variable locale est que, puisque l'adresse de retour ainsi que la valeur de certains registres du processeur sont « sauvegardés » dans la pile, autant étendre encore un peu plus l'espace occupé pour y placer des variables temporaires qui seront donc « dépilées » (en fait, libérées de fait car le pointeur de pile est mis à jour sans action de dépilement explicite) en même temps que le reste. Par conséquent, toutes tes variables locales se réfèrent donc au pointeur de pile courant à ta fonction.

    Plus précisément, comme la pile peut être exploitée par la procédure elle-même, les processeurs Intel tiennent à ta disposition le registre ebp (Base Pointer) qui sert en principe à cela : dès qu'on entre dans ta fonction, on sauvegarde ebp dans la pile, on met la valeur du nouveau pointeur de pile dans ebp et en principe, on ne touche plus à ce registre

    Cela permet d'une part de remettre la pile à l'état initial si jamais il faut sortir de la fonction en urgence (exception, return au milieu d'un bloc ...) mais également de se référer facilement à ce qui a été empilé en entrant et à l'espace réservé en utilisant des offsets fixes : ebp-4, ebp-8, ebp-40 ...

    À noter qu'une telle structure s'appelle un « cadre de pile » et que c'est exactement ce qui est mis en place par les instructions ENTER et LEAVE, même si, aujourd'hui, les compilateurs n'utilisent plus que rarement ces instructions car il reste plus rapide de le faire à la main, avec les instructions habituelles.

  3. #3
    Membre régulier
    Inscrit en
    Mai 2004
    Messages
    148
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mai 2004
    Messages : 148
    Points : 87
    Points
    87
    Par défaut
    Salut,

    Merci Obsidian, je vais tester ça ce soir ! Donc utilisation de la pile ! Pratique, en plus dans le cas d'appels récursifs de la fonction, on crée à chaque fois de nouvelles 'instances' des variables !

    Merci A+

Discussions similaires

  1. Variable statique locale à une fonction membre
    Par oodini dans le forum Langage
    Réponses: 36
    Dernier message: 26/11/2011, 23h00
  2. [Google Maps] Extraire une locale variable dans une fonction anonyme
    Par 3logy dans le forum APIs Google
    Réponses: 4
    Dernier message: 17/12/2010, 12h02
  3. Variable locale à une fonction.
    Par MoiRemi dans le forum PL/SQL
    Réponses: 7
    Dernier message: 04/02/2009, 17h05
  4. retour de variable d'une fonction
    Par thunderblade dans le forum ASP
    Réponses: 4
    Dernier message: 28/04/2005, 13h27
  5. Réponses: 5
    Dernier message: 09/02/2005, 18h50

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