C'est ce que je vois en désassemblable pour la fonction Il semble que l'adresse RET < / em> n'est pas enfoncé dans la pile du tout, alors comment fonctionne code> fonctionne p> p> (1,2,3); code>:
4 Réponses :
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 code> d'appel code> qui le met là-bas. P>
Idéalement, l'instruction appelle code> 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. P>
Comment appelle-t-il code> y trait alors? Je veux juste voir où l'adresse va i> 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? ..
sur un processeur x86 (comme pour votre exemple de langage de montage), le appel code >
instruction pousse l'adresse de retour sur la pile et le contrôle des transferts à la fonction. P>
Ainsi, sur l'entrée sur une fonction, le pointeur de la pile pointe à une adresse de retour, prêt pour 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 Le processeur IA64 fait quelque chose de similaire, sauf qu'il y a plusieurs registres possibles ( RET code> pour le pop dans le compteur de programme (EIP / RIP). P>
BL code> place l'adresse de retour dans un registre spécifique (
lr code> ou le "registre de liaison") et transfère le contrôle de la fonction. P>
B0 code> -
b7 code>) pouvant recevoir l'adresse de retour et une autre sera spécifiée dans l'instruction. (avec
B0 code> étant la valeur par défaut). P>
Exemple sur une boîte GNU / Linux: Fonction F Appels Fonction G et permet de regarder le cadre de g. p>
... <- RER (pointeur de pile affiche le haut de la pile) Les points d'enregistrement à cette adresse g libérera les vars locaux (MOVQ% RSP,% RBP) espère qu'il aide p>
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
... p>
G allez apparaître le "vieux RBP" et le stockera dans le registre RBP (Pop% RBP)
g