2016-11-23 8 views
1

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에서

+2

음. * 왜 * 당신이 이것을하려고합니까? 'foo()'를 사용하면 무엇이 문제가되는 것입니까? 특히 인라인으로 표시하는 경우 –

+0

@DavidWohlferd x86에 대해서는 _naked_ 속성을 지원하지 않기 때문에 부트 로더에 유용하지만 x86에 대해서는 궁금했습니다. 그는 아마도 프롤로그 및 에필로그 코드를 피하려고합니다. ARM을 사용하면 기본 인라인 어셈블리를 포함하는 알몸 함수를 만들 수 있습니다. 이 코드를 먼저 바이너리로 표시해야한다면 링커 스크립트가 가장 친한 친구입니다. –

+0

@DavidWohlferd 맞습니다. 프롤로그 및 에필로그 코드를 피하려고합니다. 나는 [여기] (http://stackoverflow.com/questions/2716884/using-the-naked-attribute-for-functions-in-gcc)에서 볼 수있는 것처럼 sparc에 대해 알몸 함수를 만들 수 없습니다. 나는 당신의 제안을 정확히 이해하지 못했지만, 다른 방법을 발견했다. 나는 foo()가 어셈블리 코드를 생성하고, 원래는 피하고 싶었던 부분을 제거했다. (나는 이것을 내일 게시 할 것이다). 고마워 –

답변

4

:

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

그래서 귀하의 질문에 대한 대답은 즉 - 아니는 글로벌 컨텍스트에서 함수 외부 확장 어셈블러 템플릿을 사용할 수 없습니다. 당신이 발견 한대로 기본적인 어셈블러 문장이 허용됩니다.