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][Pile] Sauvegarder variable locale dans variable passée en paramètre


Sujet :

x86 32-bits / 64-bits Assembleur

  1. #1
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut [NASM][Pile] Sauvegarder variable locale dans variable passée en paramètre
    Bonjour,

    Tout d'abord, j'aurais voulu savoir pourquoi le compilateur NASM me jette quand j'écris la ligne de code suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mov dword [ebp+8], [ebp-4]
    Je désire sauvegarder la valeur d'une variable locale dans une variable passée en paramètre.


    D'autre part, une question générale concernant la pile. Si j'ai bien compris, pour un processeur 32 bits, la pile sauvegarge des données sur 4octets. (Puisque esp est décrémenté de 4).
    La question que je me pose, il serait donc inutile en programmation de plus haut niveau, par exemple C, de déclarer des variables locales de type "char" (= 1octet) ou des variables sur deux octets puisque ces dernieres seraient transtypées au format entier.
    Ais je tort ou il y a t'il une autre subtilité derrière cela?

    Bonne journée

    Nicolas

  2. #2
    ALT
    ALT est déconnecté
    Membre émérite
    Avatar de ALT
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2002
    Messages
    1 269
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 269
    Points : 2 457
    Points
    2 457
    Par défaut
    Bonjour
    Pour la ligne de code, je ne sais pas trop (il y a longtemps que je n'ai pas bricolé en assembleur).

    Pour le reste, les données sont lues & enregistrées sur 32 bits (& non octets).
    La déclaration de variables sur 8 ou 16 bits n'a d'intérêt, de nos jours, que pour traiter certaines données (chaînes de caractères, par exemple).
    Car la quantité de mémoire disponible sur une machine ne justifie plus qu'on sacrifie à l'efficacité pour économiser quelques octets.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,

    Tu prends la doc du processeur, disponible chez le fabricant, si tu ne l'as pas déjà, et tu regardes la spécification de l'instruction mov.

    Tu comprendras alors pourquoi nasm te jette.

    Côté des types, il faut faire attention avec la pile, car sur les 32 bits, on met effectivement chaque fois ... 32 bits.
    Mais rien n'empêche de n'en utiliser qu'une partie, comme tu veux le faire avec ton instruction.
    De toute manière, il faut éviter d'utiliser un entier par exemple à la place d'un char, qui n'ont pas la même destination, cela juste pour un problème de pile, qui en fait n'est pas un "vrai" problème : il suffit de savoir ce que tu empiles, et récuperer les données de la taille ad hoc.

  4. #4
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par thewho
    Bonjour,

    Tu prends la doc du processeur, disponible chez le fabricant, si tu ne l'as pas déjà, et tu regardes la spécification de l'instruction mov.

    Tu comprendras alors pourquoi nasm te jette.
    Le processeur en question, c'est le pentium 4 et je n'ai pas la doc en rapport.
    Mais je veux bien que tu me fasses part si tu sais pourquoi nasm me jette dans cette instruction.

    Citation Envoyé par thewho
    Côté des types, il faut faire attention avec la pile, car sur les 32 bits, on met effectivement chaque fois ... 32 bits.
    Mais rien n'empêche de n'en utiliser qu'une partie, comme tu veux le faire avec ton instruction.
    T'entends donc que cela ne tient qu'a moi de décrémenter esp de 1 pour une variable de 1 octet par exemple?
    A y réfléchir comme cela, j'aurais pensé qu'à une adresse était associé 32bits...

    Citation Envoyé par thewho
    De toute manière, il faut éviter d'utiliser un entier par exemple à la place d'un char, qui n'ont pas la même destination
    Je suis d'accord avec cela! Le but de ma question est venue d'elle même en programmant en assembleur. J'ai cherché à faire le lien avec le language C par exemple.

    Bonne soirée

    NIcolas

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    633
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 633
    Points : 711
    Points
    711
    Par défaut
    Bonjour,
    Citation Envoyé par homeostasie
    Le processeur en question, c'est le pentium 4 et je n'ai pas la doc en rapport.
    Mais je veux bien que tu me fasses part si tu sais pourquoi nasm me jette dans cette instruction
    Je t'ai dit clairement : tu prends la doc, et tu regardes les spécifications de l'instruction mov.

    La doc, tu vas la chercher chez intel, téléchargement libre. La doc pentium suffit pour ce dont tu as besoin, pour l'instant.

    (Tu en as besoin, on ne va pas très loin en Assembleur sans une doc suffisante)

    Citation Envoyé par homeostasie
    T'entends donc que cela ne tient qu'a moi de décrémenter esp de 1 pour une variable de 1 octet par exemple?
    Absolument pas, sur la pile, on met [i]toujours[/b] 32 bits d'un coup (on parle bien sûr de processeurs 32 bits).
    C'est à toi, de n'utiliser ensuite que la partie qui t'intéresse, je croyais avoir été clair, apparemment pas, ça arrive.

    ---- Édité ---------------

    Bien, pour te simplifier la tâche, tu trouveras les docs nécessaires sur cette page:

    http://support.intel.com/products/pr...uals/index.htm

    Évidemment, c'est en Anglais, mais il ne faut pas se faire d'illusion ; dés qu'on veut avancer un peu en programmation, on tombe obligatoirement sur des docs en Anglais.

  6. #6
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    mov dword [ebp+8], [ebp-4]
    Les mouvements "mémoire <=> mémoire" sont interdit sous processeurs x86.

    il faut passer par un registre temporaire pour faire l'opération que tu souhaites.

    Pour ce qui est de la pile, push et pop (en mode 32 bits), fonctionnent par paquet de 4 octets (32 bits donc) ceci étant du au drapeau D du descripteur de segment (0 = 16 bit ; 1 = 32 bit). Cela affecte bien sur d'autre instruction utilisant implicitement ou explicitement la pile (CALL, RET, RETN, etc.).

    Avec un modificateur de taille d'opérande on peut toutefois pousser sur 2 bits mais là c'est clairement un "trick" puisqu'on ne peut pas écrire cette instruction via un mnémonique (possible uniquement avec les opcodes) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    66 68 3412     PUSH 1234 ; pousse seulement 2 octets en mode 32 bits
    Le problème qui s'en suit, c'est que la pile est mal alignée (misaligned stack) et le programme à toute les chances de "crasher".

  7. #7
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par thewho
    Je t'ai dit clairement : tu prends la doc, et tu regardes les spécifications de l'instruction mov.

    La doc, tu vas la chercher chez intel, téléchargement libre. La doc pentium suffit pour ce dont tu as besoin, pour l'instant.

    (Tu en as besoin, on ne va pas très loin en Assembleur sans une doc suffisante)
    Entre nous, ca fait drôle cette facon de donner des ordres... Je tâche de me plonger dans l'assembleur en parallèle avec le boulot car ca pourrait me servir et surtout ca m'interesse. A partir de là, j'y serais allé la chercher la doc après me l'avoir précisé la dernière fois, j'aurais attendu d'avoir un peu plus de temps pour bien m'y plonger. C'était juste pour avoir une réponse breve et concise. On ne peut être autodidacte sans être motivé de toute façon.
    Citation Envoyé par thewho
    C'est à toi, de n'utiliser ensuite que la partie qui t'intéresse, je croyais avoir été clair, apparemment pas, ça arrive.
    Ca arrive aussi de mal interpréter ou de mal comprendre, surtout en fin de journée...

    Citation Envoyé par thewho
    Bien, pour te simplifier la tâche, tu trouveras les docs nécessaires sur cette page:

    http://support.intel.com/products/pr...uals/index.htm
    Quand même merci, j'y jette un coup d'oeil, voir bien plus!

    EDIT: En effet énormément d'explications et d'informations, très interessant.

    Citation Envoyé par thewho
    Évidemment, c'est en Anglais, mais il ne faut pas se faire d'illusion ; dés qu'on veut avancer un peu en programmation, on tombe obligatoirement sur des docs en Anglais.
    Je ne me fais pas du tout d'illusion sur cela, je le sais très bien. Tout les jours je dois lire des spec en anglais et évidemment aussi en écrire de temps en temps. Et il clair qu'on obtient d'autant plus d'informations sur des articles ou doc anglaises concernant l'informatique et le monde de l'électronique numérique (data sheet) sur le net ou par le fournisseur.


    Citation Envoyé par Neitsa
    Les mouvements "mémoire <=> mémoire" sont interdit sous processeurs x86.

    il faut passer par un registre temporaire pour faire l'opération que tu souhaites.
    Merci pour cette réponse et celle concernant la pile!

    On va quand même éviter de la désaligner...

    Bonne journée et bon we.
    Nicolas

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [XL-2003] Sauvegarde chemin + fichier dans variable
    Par rehugg dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/12/2014, 13h08
  2. Réutilisation de variable Locale dans fonction differente
    Par Luke spywoker dans le forum Général Python
    Réponses: 4
    Dernier message: 09/07/2010, 09h13
  3. variable locale dans une Application multithreading
    Par dev1980 dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 13/06/2007, 12h59
  4. [Syntaxe] Variable locale dans une boucle for
    Par Kaeguri dans le forum C++
    Réponses: 3
    Dernier message: 04/05/2007, 09h09
  5. Réponses: 2
    Dernier message: 08/04/2007, 22h24

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