次のC言語のプログラムをclangでコンパイルしました(clangは3.4-1ubuntu3、OSはAWS上のUbuntu Ubuntu 14.04.5で32bit)。
sample.c
#include <stdio.h>
int func(int a, int b)
{
return a + b;
}
int main()
{
int x = 1;
int y = 2;
int c;
c = func(x, y);
printf("%d\n",c);
return 0;
}
clangでコンパイルしたコードをobjdump -dで逆アセンブルした結果の抜粋です。
objdump.s
8048464: 89 4c 24 04 mov %ecx,0x4(%esp)
8048468: e8 b3 ff ff ff call 8048420 <func>
804846d: 8d 0d 30 85 04 08 lea 0x8048530,%ecx
8048473: 89 45 f0 mov %eax,-0x10(%ebp)
8048476: 8b 45 f0 mov -0x10(%ebp),%eax
わたしが教えていただきたいのは、
mov %eax,-0x10(%esp)
の後で、
mov -0x10(%esp),%eax
がなぜ必要なのかということです。eaxレジスタの値は変わっていないので、不要じゃないかと感じるのです。なにか、特別な理由があるのでしょうか。ちなみに、gccでコンパイルしても生成されるのは似たようなコードでした。
識者の方、教えていただけると幸いです。