LoginSignup
0
0

More than 3 years have passed since last update.

C言語のコンパイルで無駄な機械語コードが生成される意味がわかりません

Posted at

次の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でコンパイルしても生成されるのは似たようなコードでした。
識者の方、教えていただけると幸いです。

0
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0