c 프로토 타입을 사용하지 않고 어셈블리 함수를 작성하려고합니다. gcc가 확장 된 asm을 전역 컨텍스트에서 사용할 수없는 것처럼 보이는 이유가 있습니다. 전역 함수에서 sparc 확장 된 asm 사용
그 succssefully 컴파일 다음 코드를 고려하십시오 : 다음과 같이 나 또한, ASM을 사용하여 프로토 타입을 정의하기 위해 노력하고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을 사용하지 않는 경우, 컴파일러는 코드 승인 있습니다 :
asm(".global foo2\n\t"
"foo2:\n\t");
asm("jmpl %o7 + 8, %g0\n\t");
감사합니다. GCC Documentation에서
음. * 왜 * 당신이 이것을하려고합니까? 'foo()'를 사용하면 무엇이 문제가되는 것입니까? 특히 인라인으로 표시하는 경우 –
@DavidWohlferd x86에 대해서는 _naked_ 속성을 지원하지 않기 때문에 부트 로더에 유용하지만 x86에 대해서는 궁금했습니다. 그는 아마도 프롤로그 및 에필로그 코드를 피하려고합니다. ARM을 사용하면 기본 인라인 어셈블리를 포함하는 알몸 함수를 만들 수 있습니다. 이 코드를 먼저 바이너리로 표시해야한다면 링커 스크립트가 가장 친한 친구입니다. –
@DavidWohlferd 맞습니다. 프롤로그 및 에필로그 코드를 피하려고합니다. 나는 [여기] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)에서 볼 수있는 것처럼 sparc에 대해 알몸 함수를 만들 수 없습니다. 나는 당신의 제안을 정확히 이해하지 못했지만, 다른 방법을 발견했다. 나는 foo()가 어셈블리 코드를 생성하고, 원래는 피하고 싶었던 부분을 제거했다. (나는 이것을 내일 게시 할 것이다). 고마워 –