2014-07-16 3 views
3

C 코드에서 인라인 어셈블리를 사용하는 방법을 배우려고합니다. 나는 두 개의 정수를 추가해야하는 작은 프로그램을 만들었습니다C에서 인라인 어셈블리가 제대로 작동하지 않습니다.

목적은, 레지스터 %r8%r9ab로드를 추가 한 다음 a 다시 출력을 넣어했다
int main(){ 
     int a=1; 
     int b=2; 
     asm( "movl %0, %%r8d;" 
       "movl %1, %%r9d;" 
       "addl %%r8d, %%r9d;" 
       "movl %%r9d, %1;" 
       : "=r" (a) 
       : "r" (b) 
       :"%r8","%r9"); 
     printf("a=%d\n",a); 
     return 0; 
} 

. 그러나이 프로그램은 a=3 대신 a=2을 인쇄합니다. 문제가 인라인 기술 또는 어셈블리 자체에 있는지 확실하지 않습니다.

답변

4

여기에 두 가지 문제가 있습니다

첫째 : 당신이 출력 피연산자 a에 사용하는 "=r" 제약 피연산자는 쓰기 전용입니다 컴파일러에 지시 -이 초기 값이 필요하지 않은 것으로 가정 할 수있다 . 이것은 분명히 당신의 코드에 해당하지 않습니다! 컴파일러에서 이라는 초기 값이이라는 사실을 알리려면 한정자를 "+r"으로 변경하십시오.

둘째 : 결과를 잘못된 레지스터로 이동 중입니다! 마지막 의 대상인 %1은 이 아닌 a에 해당하는 레지스터입니다. 당신은 %0을 원합니다.

는 고정 :

asm(
    "movl %0, %%r8d;" 
    "movl %1, %%r9d;" 
    "addl %%r8d, %%r9d;" 
    "movl %%r9d, %0;" 
    : "+r" (a) 
    : "r" (b) 
    : "%r8", "%r9" 
); 
+0

감사합니다! 두 번째 오류는 작동하지 않는 것을 보았을 때 방금 변경 한 것입니다. 그래서 나는 아마도 잘못된 레지스터를 사용하고있을 것이라고 생각했습니다. 이제 작동합니다! –

관련 문제