2016-11-23 2 views
1

Ich versuche, eine Assembly-Funktion ohne Verwendung von C-Prototypen zu schreiben. Aus irgendeinem Grund sieht es so aus, als ob der gcc es nicht erlaubt, erweiterte asm im globalen Kontext zu verwenden.Verwenden Sie Sparc erweiterte asm in globalen Funktion

Bitte beachten Sie die folgenden Code, der kompiliert succssefully:

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

Wenn ich auch versuche, den Prototyp mit asm zu definieren, wie folgt:

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

der Compiler geben Sie mir die folgenden Fehler wie wenn erweiterte asm nicht im globalen Kontext verwendet werden kann.

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

Bitte beachten Sie, dass, wenn ich nicht extened asm wie folgt verwenden, der Compiler den Code genehmigt:

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

Dank.

+2

Umm. * Warum * versuchst du das zu tun? Was ist los mit der Verwendung von 'foo()'? Vor allem, wenn Sie es als Inline markieren. –

+0

@DavidWollerd Ich war auch neugierig auf diese, obwohl auf x86 ist es nützlich für Bootloader, da x86 unterstützt das _naked_ Attribut für eine Funktion. Er versucht wahrscheinlich, jeglichen Prolog und Epilog-Code zu vermeiden. Mit ARM bin ich mir ziemlich sicher, dass Sie eine nackte Funktion erstellen können, die eine grundlegende Inline-Assemblierung enthält. Wenn Sie diesen Code zuerst in einer Binärdatei erscheinen lassen möchten, ist ein Linker-Skript Ihr bester Freund. –

+0

@DavidWohlferd Das ist richtig, ich versuche jeden Prolog und Epilog Code zu vermeiden. Ich kann keine Nacktfunktion für Sparc erstellen, wie in [hier] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc) zu sehen ist. Ich habe deinen Vorschlag nicht genau verstanden, aber ich habe einen anderen Weg gefunden - ich habe foo() generierten Assembler-Code genommen und einfach die Teile entfernt, die ich ursprünglich vermeiden wollte (ich werde es morgen posten). Danke –

Antwort

4

Vom 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).

So ist die Antwort auf Ihre Frage ist, dass - nein, es ist nicht möglich, erweitern Assembler-Vorlagen außerhalb einer Funktion im globalen Kontext zu verwenden. Wie Sie festgestellt haben, sind grundlegende Assembleranweisungen erlaubt.

Verwandte Themen