2016-11-23 4 views
1

J'essaie d'écrire une fonction d'assemblage sans utiliser de prototypes c. Pour une raison quelconque, il semble que gcc ne permet pas d'utiliser asm étendu dans le contexte global.Utilisation de sparc étendu asm dans la fonction globale

S'il vous plaît considérez le code suivant compilant succssefully:

void *g_var; 
void foo() 
{ 
    asm ("stx  %%i7, [%0]" 
     :"=r" (g_var)); 
} 

Quand je suis également en train de définir le prototype en utilisant asm, comme suit:

asm(".global foo2\n\t" 
    "foo2:\n\t"); 
asm ("stx  %%i7, [%0]" 
    :"=r" (g_var)); 

le compilateur me donne l'erreur suivante comme si extended asm ne peut pas être utilisé dans un contexte global.

foo.c:151:2: error: expected ')' before ':' token :"=r" (return_addr)); ^

S'il vous plaît noter que lorsque je ne l'utilise asm extened comme suit, le compilateur approuve le code:

asm(".global foo2\n\t" 
    "foo2:\n\t"); 
asm("jmpl  %o7 + 8, %g0\n\t"); 

Merci.

+2

Umm. Pourquoi essayez-vous de faire cela? Quel est le problème avec simplement utiliser 'foo()'? Surtout si vous le marquez comme inline. –

+0

@DavidWohlferd J'étais aussi curieux à ce sujet, bien que sur x86 il soit utile pour les chargeurs de démarrage puisque x86 ne supporte pas l'attribut _naked_ sur une fonction. Il essaye probablement d'éviter tout prologue et code épilogue. Avec ARM, je suis sûr que vous pourriez créer une fonction nue contenant un assemblage en ligne de base. Si vous avez besoin de faire apparaître ce code en premier dans un fichier binaire, alors un script d'éditeur de liens est votre meilleur ami. –

+0

@DavidWohlferd C'est vrai, j'essaie d'éviter tout prologue et code épilogue. Je ne peux pas créer de fonction nue pour sparc comme on peut le voir dans [ici] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc). Je n'ai pas bien compris votre suggestion, mais j'ai trouvé un autre moyen - j'ai pris le code d'assemblage généré par foo(), et j'ai simplement supprimé les parties que je voulais éviter (je le posterai demain). Merci –

Répondre

4

De l'GCC Documentation:

Note that extended asm statements must be inside a function. Only basic asm may be outside functions (see Basic Asm). Functions declared with the naked attribute also require basic asm (see Function Attributes).

Donc, la réponse à votre question est que - pas il est impossible d'utiliser des modèles assembleur étendus en dehors d'une fonction dans le contexte mondial. Comme vous avez trouvé les instructions assembleur de base sont autorisés.