2012-01-10 5 views
3

인라인 어셈블리에서 스레드 로컬 변수를 사용하려고하지만 어셈블 된 코드를 볼 때 컴파일러가 올바른 코드를 생성하지 않는 것으로 보입니다. saved_sp 세계적으로__thread long saved_sp로 선언 된 다음 인라인 코드,로컬 변수 및 인라인 어셈블리 스레드

__asm__ __volatile__ (
     "movq %rsp, saved_sp\n\t"); 

에 대한 분해는 다음과 같다. 내가 GCC는 스레드 로컬 변수의 FS 세그먼트를 사용하는 알고 있기 때문에, 명확하게 올바른 일이 아니다

mov %rsp,0x612008 

.

mov %rsp, fs:somevalue 

과 같은 것을 생성 했어야합니다. 왜 이렇게이다? 인라인 어셈블리에서 스레드 로컬 변수를 사용하고 있습니까?

+0

내가 GCC 생각하지 않는다는 어쨌든 인라인 어셈블리 코드를 수정합니다. 아마도 세그먼트 우선 적용 프리픽스를 명시 적으로 지정해야합니다. '.byte 0x64 \ n \ t "''''movq % rsp, saved_sp \ n \ t"'앞에 삽입 해보십시오. –

답변

4

간단히 말해서 스레드 로컬 변수에 대한 포인터를 가져 와서 쓰기 만하면됩니다.
컴파일러는 반드시 long *saved_fp_p = &saved_fp을 올바르게 수행해야하며 인라인 어셈블리는 로컬 변수 인 saved_fp_p 만 처리합니다.

__asm__ __volatile__ (
    "mov %%rsp, 0(%0)" : : "r" (&saved_sp) 
); 

이것은 saved_fp의 주소를 해결 담당 컴파일러를두고, 어셈블리 코드가 레지스터에 그것을 가져옵니다

또한 GCC의 입력과 출력 구문을 사용할 수 있습니다. 우리는이 또한 작동 발견

,

__asm__ __volatile__ asm ("mov %rsp,%0" : "=m" (saved_sp)) 
+0

이것은 좋은 영리 솔루션이지만, 가리 키기 위해 레지스터를 사용하지 않고 saved_sp에 직접 쓰는 것을 선호합니다. – MetallicPriest

+1

아마도'asm ("mov % rsp, % 0": : "m"(saved_fp))'이 작동합니다. 중요한 부분은 어셈블러가 아닌 컴파일러가 saved_fp 변수를 처리하도록하는 것입니다. 컴파일러는 확실히 그것을 올바르게 할 수 있습니다, 어셈블러는 나쁘게 그것을 할 것 같습니다. – ugoren

+0

이것은 실제로 작동합니다! 감사! – MetallicPriest

관련 문제