Я пытаюсь написать функцию сборки без использования прототипов 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");
Спасибо.
Umm. * Почему ты пытаешься это сделать? Что случилось с использованием 'foo()'? Особенно, если вы отметите его как встроенный. –
@DavidWohlferd Мне тоже было интересно, хотя на x86 оно полезно для загрузчиков, поскольку x86 не поддерживает атрибут _naked_ для функции. Вероятно, он пытается избежать кода пролога и эпилога. С ARM я уверен, что вы можете создать голую функцию, содержащую базовую встроенную сборку. Если вам нужно сделать этот код первым в двоичном формате, тогда ваш лучший друг будет использовать компоновщик. –
@DavidWohlferd Правильно, я стараюсь избегать кода пролога и эпилога. Я не могу создать голой функции для sparc, как это видно в [здесь] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc). Я не совсем понял ваше предложение, но я нашел другой способ - я принял foo() сгенерированный ассемблерный код и просто удалил части, которые я изначально хотел избежать (я выложу их завтра). Спасибо –