9
votes

Comment l'adresse de retour est-elle spécifiée dans la pile?

C'est ce que je vois en désassemblable pour la fonction (1,2,3); : xxx

Il semble que l'adresse RET < / em> n'est pas enfoncé dans la pile du tout, alors comment fonctionne fonctionne


0 commentaires

4 Réponses :


3
votes

Cela dépend de l'ABI et de l'architecture, mais si l'adresse de retour se retrouve sur la pile, c'est un effet secondaire de l'instruction d'appel qui le met là-bas.


0 commentaires

6
votes

Idéalement, l'instruction appelle doit prendre en charge cela. Le prochain emplacement du compteur de programme sera poussé dans la pile. Lorsque la fonction (sous la routine) qui a été appelée complète le fonctionnement et lorsqu'elle rencontre une déclaration de retour, le contrôle passe maintenant à l'adresse qui a été poussée dans la pile et elle sera sautée.


4 commentaires

Comment appelle-t-il y trait alors? Je veux juste voir où l'adresse va est spécifiée


Vous aurez décomposer la méthode d'appel pour davantage de code hexagonal. La feuille de triche pour l'ensemble d'instructions spécifiée pour le processeur particulier révélerait cela. Par exemple, si vous prenez le plus simple des microprocesseurs 8085 et que vous ajoutez une instruction X ne montrera pas la deuxième valeur (supposons que Y aime Ajouter X, Y). Au lieu de cela, il ajoutera la valeur x à un registre réservé au sein du processeur, dites H et stockez la valeur dans H. Le bit de débordement doit-il y avoir une autre registre dans un autre registre. Voici comment ajouter des instructions est conçue. L'instruction d'appel aura également des règles prédéfinies similaires


Une partie du travail de l'instruction d'appel consiste à appuyer sur l'adresse de retour sur la pile. L'adresse de retour n'est que l'adresse directement après les paramètres à l'instruction d'appel. Pour voir quelle est l'adresse de retour dans votre exemple ci-dessus, vous devez consulter la pile dès que le programme entrera dans la procédure à 0x4012D0.


@Mask, vous pouvez penser que l'adresse de retour est transmise en tant qu'adresse des instructions d'appel stockées dans le registre IP / EIP. Lorsque le processeur reçoit un instruction suivant et que l'instruction d'appel (extrême / court, etc.), il peut ajouter une taille d'instruction à la propriété intellectuelle et la pousser à la pile (SP enregistrer) avec cela permettra de modifier la valeur de la propriété intellectuelle sur une adresse appropriée Réfonctionnement avec l'instruction d'appel (relatif pour le court, absolu pour la loin du registre, etc.). P.s. Cette question n'a toujours aucune réponse approuvée? ..



10
votes

sur un processeur x86 (comme pour votre exemple de langage de montage), le appel instruction pousse l'adresse de retour sur la pile et le contrôle des transferts à la fonction.

Ainsi, sur l'entrée sur une fonction, le pointeur de la pile pointe à une adresse de retour, prêt pour RET pour le pop dans le compteur de programme (EIP / RIP).

Toutes les architectures de processeur ne mettent pas l'adresse de retour sur la pile, il existe souvent un ensemble d'un ou plusieurs registres conçus pour contenir des adresses de retour. Sur les processeurs ARM, l'instruction BL place l'adresse de retour dans un registre spécifique ( lr ou le "registre de liaison") et transfère le contrôle de la fonction.

Le processeur IA64 fait quelque chose de similaire, sauf qu'il y a plusieurs registres possibles ( B0 - b7 ) pouvant recevoir l'adresse de retour et une autre sera spécifiée dans l'instruction. (avec B0 étant la valeur par défaut).


0 commentaires

1
votes

appel pousse la valeur actuelle du registre RIP (adresse de retour) à la pile + l'appel
RET POPS L'adresse de retour (que Appelez poussé) du haut de la pile (points de registre RER) et l'écrit dans le registre RIP.

Exemple sur une boîte GNU / Linux: Fonction F Appels Fonction G et permet de regarder le cadre de g.

adresse basse

... <- RER (pointeur de pile affiche le haut de la pile) Les points d'enregistrement à cette adresse
G local vars

Pointeur de base de F (Valeur RBP ancienne) <- RBP (Pointeur de base) Inscrivez-vous sur cette adresse
L'adresse de FS de F (Vieille valeur RIP) (c'est ce que l'appel appelle (de F) poussé et ce que le ret (de g) va pop) arguments que f appelé g avec et ne s'intègre pas dans les registres (je pense que sur Windows c'est différent)
...

adresse haute

g libérera les vars locaux (MOVQ% RSP,% RBP)
G allez apparaître le "vieux RBP" et le stockera dans le registre RBP (Pop% RBP)
g va , qui modifiera RIP avec la valeur stockée où des points RSP à

espère qu'il aide


0 commentaires