2013-11-27 4 views
1

an old answer을 따르려고했으나 뭔가 잘못하고 있어야합니다. 함수가 인라인되지 않습니다.이 함수는 여전히 디스 어셈블리에서 호출됩니다. 여기에 내가 무슨 짓을 :간단한 어셈블리 함수 인라이닝

get_regs.h :
inline unsigned long __get_esp(void) {
__asm__("movl %esp,%eax");
}

program.c에 :
...
#include "get_regs.h "
...
extern unsigned long __get_esp(void);

tmp = __get_esp();

...는 (여러 가지 이유로 다른 옵션)로 컴파일 :
gcc -g -fno-stack-protector -mpreferred-stack-boundary=2 program.c

이 헤더 파일의 정의를 포함하는 두 번째 권고를 따른다.

확장 어셈블리를 사용하고 %eax의 결과를 tmp에 복사 할 수 있지만 인라이닝을 이해하고 싶습니다. 그래서 몇 가지 히트 곡을 발견했지만 아무도 내 경우를 커버하지 못했습니다.

시스템 :
- 우분투 12.04
- gcc 4.6.3.
- x86 32 비트

답변

3

인라인 할 가능성이 가장 높은 컴파일러 최적화가 가능해야합니다.

그런데, 함수의 인라인되지 않은 복사본을 특별히 필요로하지 않는 한, extern 재 선언을 삭제하고 헤더 파일에 포함 된 인라인 된 선언을 사용할 수 있습니다.

+0

-O1을 사용하면 이미 인라인됩니다. 고마워요! – gnometorule