GCC의 인라인 어셈블러를 사용하여 x86 어셈블리에 익숙해 지려고합니다. 두 개의 숫자 (a
및 b
)를 추가하고 결과를 c
에 저장하려고합니다. 저는 약간 다른 시도가 4 번 있는데 그 중 3 가지가 효과가 있습니다. 마지막은 예상 된 결과를 생성하지 않습니다.두 개의 숫자 추가하기
처음 두 예제는 중간 레지스터를 사용하며 두 함수 모두 정상적으로 작동합니다. 세 번째와 네 번째 예제는 두 개의 값을 중간 레지스터없이 직접 추가하려고 시도하지만 결과는 최적화 수준과 입력 값을 추가하는 순서에 따라 달라집니다. 나는 무엇이 잘못 되었는가?
환경이다
int a = 4;
int b = 7;
int c;
예 1 :
asm(" movl %1,%%eax;"
" addl %2,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
예 2
다음 가i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
우선, 변수 선언
asm(" movl %2,%%eax;"
" addl %1,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
예 3
asm(" movl %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14
예 4
// this one appears to calculate a+a instead of a+b
asm(" movl %1,%0;"
" addl %2,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=8
// output with -O3: a=4, b=7, c=11
을 해결했다.Matthew Slattery's answer이 맞습니다. 전에 b
및 c
모두 eax
을 재사용하려고했던 : 장소에 매튜의 제안 수정 프로그램
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %eax
addl %eax, %eax
는, 지금 별도로 c
를 개최 ecx
를 사용합니다.
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %ecx
addl %eax, %ecx
최적화 사용 여부에 관계없이 정상적으로 작동합니다. 어셈블리 언어 목록을 얻으려면 -S로 컴파일 해보십시오. 그러면 어떤 레지스터가 사용 중인지 알 수 있습니다. – TonyK
최적화 수준에 따라 다른 결과가 나타났습니다. 코드 샘플이 새로운 출력으로 업데이트되었습니다. –
그럼 조립 목록에서 무엇을 말합니까? – TonyK