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 :

ret + registre


Sujet :

x86 32-bits / 64-bits Assembleur

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut ret + registre
    Salut,

    J'ai besoin de faire une proc qui va être utilisée pour plusieurs choses différentes et dont le nombre d'éléments empilés sur la pile peut varier d'un call à un autre.
    Je me suis dit "tiens ce serait bien si on pouvais faire un ret reg".
    Mais queunini, ça ne fonctionne pas : /
    A moins qu'il y ait déjà une instruction de prévue pour faire un ret qui va nettoyer la pile en même temps, mais avec une valeur dynamique et non une valeur mise en mémoire (du style "ret 4") qui ne servirait à rien dans mon cas puisque le "4" ne serait plus valable d'un call à un autre.
    Voilà ce que j'aimerais savoir.. Je suis encore loin de connaître toutes les instructions asm.
    J'ai bien d'autres solutions, du style faire un "add esp,reg" dans la proc elle-même puis sortir de celle-ci via un jump, mais ça m'étonne de ne pouvoir faire un truc du genre "ret reg"..

    Savez-vous si il existe par exemple une instruction précise pour ce cas de figure ?
    Sinon tant pis j'utiliserais un jump.

  2. #2
    Membre chevronné Avatar de bifur
    passe le balais et l'aspirateur
    Inscrit en
    Mars 2008
    Messages
    314
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations professionnelles :
    Activité : passe le balais et l'aspirateur

    Informations forums :
    Inscription : Mars 2008
    Messages : 314
    Par défaut
    la méthode la plus connue est de faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mov ebp,esp
     
    ;ici empilage des paramètre de ta fonction
     
    call tafonction
    mov esp,ebp
    ça consiste ea souvegarder esp avant d'empiler les paramètres de ta fonction et de restaurer ça une fois la fonction terminé (pas forcé d'uttiliser le registre ebp non plus)

    par contre attention! lors de "call tafonction" le système empile eip (ou selement ip si t'est en 16bit) pour pouvoir fair un ret correcte donc si tu commence tafonction par le dépilage des paramètres de ta fonction tu va dépiler eip et le ret va planter

    NB: lors d'un callf/retf on empile le selecteur de segment aussi

  3. #3
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    18 284
    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 284
    Par défaut
    C'est le fonctionnement du prologue et l'épilogue d'une fonction en C

    http://en.wikipedia.org/wiki/Function_prologue
    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

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut
    Citation Envoyé par chrtophe Voir le message
    C'est le fonctionnement du prologue et l'épilogue d'une fonction en C

    http://en.wikipedia.org/wiki/Function_prologue
    Yep, mais pas dans ce précis.
    Il fonctionne pour sortir de la proc oui, mais pas pour nettoyer la pile de tout les arguments qui ont été empilés. D'où le faite de faire un mov reg,esp avant d'appeler la proc comme le dit bifur.
    Et impossible d'utiliser "ret" car au moment où tu fais ton "mov esp,reg", tu perds ton addr de retour. C'est la raison de l'utilisation de mon jump.
    Il y a peut être une autre solution simple (qui permettrait de le faire "dans" la proc), mais perso je n'en ai pas vu d'autre. Puis celle ci fonctionne.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut
    Voilà terminé. J'ai pu faire une proc de traitement de string vraiment pratique.
    Ca le fait de pouvoir écrire sur quelques lignes un code qui tiendrait sur plusieurs centaines de lignes, voir millier en C.
    Vive l'asm, le seul véritable language de prog ^

  6. #6
    Membre Expert
    Avatar de Forthman
    Homme Profil pro
    conception mécanique
    Inscrit en
    Janvier 2005
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Tarn et Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : conception mécanique
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2005
    Messages : 702
    Par défaut
    Je dis ça, je dis rien, mais devoir purger la pile ne devrait pas arriver non ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2013
    Messages
    407
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2013
    Messages : 407
    Par défaut
    lol, j'étais partie dans un truc de dingue inutilement ^
    Suffisait juste de remettre la bonne valeur dans la pile. Moi je ne voyais que par un add ou un sub, mais pas un mov, ché pas pourquoi, zappé de mon esprit.
    Avant de voir ton post, j'avais fait un truc qui commençait pareil, un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    mov eax,esp
    call plop
     
    plop:
    (une suite d'opération pour calculer le nombre arguments, obligatoire pour le code lui même car boucle,et que j'utilisais également pour faire le "add esp,reg").
    ...
    code
    ...
    add esp,reg
    mov ebx,[ret addr]
    jmp ebx
    edit: je viens de modifier mon code. Au final j'ai viré le "add esp,reg" puisque inutile, ce qui a simplifié un peu le code, j'ai par contre gardé le système de jump, juste histoire de pouvoir nettoyer la pile avec le "mov esp,reg" à l'intérieur de la proc.

Discussions similaires

  1. [Windows]accès base de registre windows
    Par Greg01 dans le forum API standards et tierces
    Réponses: 27
    Dernier message: 05/06/2007, 15h14
  2. Accès à la base de registre windows à distance
    Par xavame dans le forum Sécurité
    Réponses: 4
    Dernier message: 13/07/2005, 15h23
  3. Comparaison d'un registre 8 bits avec une variable 32 bits
    Par tupperware dans le forum x86 32-bits / 64-bits
    Réponses: 3
    Dernier message: 15/10/2002, 10h25
  4. registre de connexion windows internet
    Par lafaryan dans le forum Web & réseau
    Réponses: 2
    Dernier message: 21/08/2002, 12h52
  5. Utilisez vous la base de registres ?
    Par gRRosminet dans le forum C++Builder
    Réponses: 8
    Dernier message: 04/06/2002, 13h55

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