2014-03-31 5 views
0

나는 예를 들어 여러 구조체/노동 조합을 가지고 : 내가 예를 들어, 인라인 어셈블리에서의 요소에 액세스 할 필요가사용 노조/구조체 멤버

union 
{ 
    uint8_t X; 
    struct __attribute__((packed, aligned(1))) 
    { 
    uint8_t A : 1; 
    uint8_t B : 1; 
    uint8_t C : 1; 
    uint8_t D : 1; 
    uint8_t E : 1; 
    uint8_t F : 1; 
    uint8_t G : 1; 
    uint8_t H : 1; 
    }; 
}DATA;  

:

asm volatile 
(
"\ 
    mov %1, %%eax  \t\n\ 
    inc %%eax   \t\n\ 
    mov $0, %0  \t\n\ 
" 
:"=d"(u->X) 
:"d"(temp)  
); 

마지막 줄에 응용 프로그램 segfaults가 있습니다.

미러 포인터를 만들고 구조체를 통해 구조체에 액세스하려고했지만 효과가 없으므로 세그 폴트가 없습니다. 그래서 임시 변수를 사용합니다. 그것은 가능합니까 아니면 이상한 일을하려고합니까?

답변

1

인라인 어셈블리는 출력이나 clobber 목록에 나열되지 않은 레지스터를 변경하면 안됩니다.

예에서 컴파일러는 코드에 따라 RAX에 u을 저장하도록 선택했습니다. EAX는 RAX의 하반부입니다.

+0

정말 고마워요. 나는 asm 템플릿의 clobber 부분에 eax를 추가하여이 문제를 해결했다. – pugnator

+0

명명 된 레지스터를 clobber리스트로 옮기는 것은 거의 수정이되지 않았다. (in/out 피연산자를 사용하거나, "+ d" (u-> X)'를 사용하거나 _aliases_/_early clobbers_,' "= & d"(u-> X) : "0"(임시)')를 사용하십시오. _how_ 구조화와 상관없이 코드 결과는'u-> X = 0;과 기능적으로 동일합니다. - 당신이하려는 것은 무엇입니까? –

관련 문제