2016-11-23 14 views
1

Я пытаюсь написать функцию сборки без использования прототипов c. По какой-то причине gcc не позволяет использовать расширенный asm в глобальном контексте.Использовать sparc extended asm в глобальной функции

Пожалуйста, обратите внимание на следующий код, который собирает succssefully:

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

Когда я также пытаюсь определить прототип, используя ассемблер, следующим образом:

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

компилятор дает мне следующую ошибку, как если расширенный asm не может использоваться в глобальном контексте.

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

Пожалуйста, обратите внимание, что, когда я не использую extened ассемблера следующим образом, компилятор утверждает код:

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

Спасибо.

+2

Umm. * Почему ты пытаешься это сделать? Что случилось с использованием 'foo()'? Особенно, если вы отметите его как встроенный. –

+0

@DavidWohlferd Мне тоже было интересно, хотя на x86 оно полезно для загрузчиков, поскольку x86 не поддерживает атрибут _naked_ для функции. Вероятно, он пытается избежать кода пролога и эпилога. С ARM я уверен, что вы можете создать голую функцию, содержащую базовую встроенную сборку. Если вам нужно сделать этот код первым в двоичном формате, тогда ваш лучший друг будет использовать компоновщик. –

+0

@DavidWohlferd Правильно, я стараюсь избегать кода пролога и эпилога. Я не могу создать голой функции для sparc, как это видно в [здесь] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc). Я не совсем понял ваше предложение, но я нашел другой способ - я принял foo() сгенерированный ассемблерный код и просто удалил части, которые я изначально хотел избежать (я выложу их завтра). Спасибо –

ответ

4

От 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).

Таким образом, ответ на ваш вопрос в том, что - нет, это не представляется возможным использовать расширенные шаблоны ассемблера вне функции в глобальном контексте. Поскольку вы нашли, что основные инструкции ассемблера разрешены.