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!
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
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
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