2015-10-13 2 views
0

J'essaie d'écrire une fonction simple en utilisant l'assemblage en ligne en C pour powerpc64, ma fonction appelle une autre fonction et j'ai quelques questions à ce sujet.Appel de sous-programme PPC64 de l'assemblage en ligne

1) Comment enregistrer le registre LR avant de brancher en utilisant 'bl' sur le sous-programme?

Plus précisément, pour ce code:

void func(void *arg1, void *arg2) 
{ 
    void *result; 
    __asm__ volatile (
    ... 
    ... 
    "bl <address>\n"  //Call to subroutine 
    "nop\n" 
    ... 
    : [result]"=r"(result) 
    : [arg1]"r"(arg1), 
    [arg2]"r"(arg2) 
    ); 
    return result; 
} 

Le compilateur génère le code de prologue pour cela sans les "MFLR 0; std 0, 16 (1)" des instructions pour sauver LR car il ne sait pas que le sous-programme est appelé dans mon code d'assemblage. Dois-je inclure ces instructions dans mon code d'assemblage? Si oui, comment puis-je connaître la taille de la pile créée par le code du prologue du compilateur pour accéder à la zone de sauvegarde LR de la fonction appelée 'func'? (à partir des didacticiels powerpc sur developerworks, les registres LR doivent être sauvegardés dans la pile de la fonction 'calling')

2) Je crois que je devrai sauvegarder arg1 et arg2 avant d'appeler le sous-programme, qui est le bon endroit pour temp stocke ces paramètres avant de faire un appel de sous-programme - la zone de sauvegarde des paramètres ou les registres non-volatils? Je veux juste savoir la bonne façon que cela est fait dans la qualité de production ppc64 code

Merci d'avance!

+0

Je vous suggère d'écrire cette fonction directement dans l'assemblage. Je dois dire que je n'ai jamais vu un appel à sous-routine à partir d'un bloc en ligne ASM (dont l'utilisation est déjà complexe sans cela). Je ne suis pas sûr que l'approche que vous avez choisie soit compatible avec le "code de qualité de production". Je ne blâme pas l'expérience du tout (j'ai aussi passé du temps à comprendre inline asm) mais je pense que c'est compliqué: LR et autres registres doivent être sauvegardés ... mais cela signifie créer le prologue/épilogue de la fonction func à l'intérieur du bloc en ligne asm! Au fait, quel est le but de cette fonction? – amigadev

+0

Merci amigadev! La fonction que j'essaye d'écrire fait une manipulation de pile, je veux appeler un sous-programme de cette fonction qui enregistre le contenu de la pile dans le tas. J'ai envisagé d'écrire le code directement dans l'assemblage mais je le fais dans le cadre d'un projet et la même fonction pour d'autres plateformes (x86 etc) ont une fonction inline simple et faire le fichier assembly pour ppc nécessiterait des modifications Makefile spéciales.Je suis nouveau à l'écriture ppc assemblage donc c'est un peu surprenant que faire une chose aussi simple que d'appeler un sous-programme est si difficile à faire de l'assemblage en ligne – user2698038

+0

La complexité repose sur l'assemblage en ligne, pas l'assemblage PPC ;-) La réponse de mpe donne des faits plus précis à propos de quoi faire. Et il dit aussi qu'avec l'assemblage en ligne, il est difficile d'être assez sûr. – amigadev

Répondre

1

AFAIK il n'y a aucun moyen de le faire correctement. Inline asm n'est pas conçu pour appeler des fonctions.

Vous ne pouvez pas connaître de manière fiable la taille de l'image de pile générée par le compilateur, en fait toute la fonction peut être en ligne ou, comme vous l'avez constaté, le compilateur peut ne pas générer de trame de pile.

Mais vous n'avez pas avez pour stocker LR dans le cadre de la pile de l'appelant, c'est mieux si vous le faites, mais ce n'est pas 100% requis. Il suffit donc de le mettre dans un non-volatile, marquez ce registre comme clobé, et restaurez-le au retour.

Vous ne devriez pas avoir à sauvegarder arg1 et arg2, mais vous devez marquer tous les registres volatiles comme étant clobés. Ensuite, le compilateur sauvegardera tout ce qui se trouve dans les registres volatils (comme arg1 et arg2) avant d'appeler votre asm. Souvenez-vous également que certains champs CR peuvent être clobés. J'ajouterais aussi de la «mémoire» aux clobbers pour que GCC soit pessimiste quant à l'optimisation à travers l'asm.

Si vous faites tout ce qu'il pourrait travail, à moins que j'oublie quelque chose :)