C 命令あたりの asm 命令の数は?

答えはありません。 int a; のようなステートメント asm 行が必要ない場合があります。 a = call_is_inlined(); のような while ステートメント 20 行以上の asm 行が必要になる場合があります。

C プログラムをコンパイルしてから objdump -Sd ./a.out を開始すると、自分自身を見ることができます。 . asm と C コードが混在して表示されるので、1 つの C 行に対して生成される asm 行の数がわかります。例:

test.c

int get_int(int c);
int main(void) {
    int a = 1, b = 2;
    return getCode(a) + b;
}

$ gcc -c -g test.c

$ objdump -Sd ./test.o

00000000 <main>:
int get_int(int c);
int main(void) { /* here, the prologue creates the frame for main */
   0:   8d 4c 24 04             lea    0x4(%esp),%ecx
   4:   83 e4 f0                and    $0xfffffff0,%esp
   7:   ff 71 fc                pushl  -0x4(%ecx)
   a:   55                      push   %ebp
   b:   89 e5                   mov    %esp,%ebp
   d:   51                      push   %ecx
   e:   83 ec 14                sub    $0x14,%esp
    int a = 1, b = 2; /* setting up space for locals */
  11:   c7 45 f4 01 00 00 00    movl   $0x1,-0xc(%ebp)
  18:   c7 45 f8 02 00 00 00    movl   $0x2,-0x8(%ebp)
    return getCode(a) + b;
  1f:   8b 45 f4                mov    -0xc(%ebp),%eax
  22:   89 04 24                mov    %eax,(%esp)
  25:   e8 fc ff ff ff          call   26 <main+0x26>
  2a:   03 45 f8                add    -0x8(%ebp),%eax
} /* the epilogue runs, returning to the previous frame */
  2d:   83 c4 14                add    $0x14,%esp
  30:   59                      pop    %ecx
  31:   5d                      pop    %ebp
  32:   8d 61 fc                lea    -0x4(%ecx),%esp
  35:   c3                      ret

「C命令」の意味がわかりません。おそらくステートメントまたは行ですか?もちろん、これは多くの要因によって大きく異なりますが、私自身のいくつかのサンプル プログラムを見た後、それらの多くは 2-1 マーク (LOC ごとに 2 つのアセンブリ命令) に近く、これが何であるかはわかりません。手段またはそれがどのように役立つか

特定のプログラムと実装の組み合わせについて、コンパイラにアセンブリのみを生成するように要求することで、これを自分で把握できます (gcc -S たとえば) または、既にコンパイルされた実行可能ファイルで逆アセンブラを使用する (ただし、比較するにはソース コードが必要です)。

編集

達成しようとしていることの明確化に基づいてこれを拡張するだけです (最新のプロセッサが 1 秒間に実行できるコードの行数を理解する):

最新のプロセッサは 1 秒あたり 30 億サイクルで実行できますが、1 秒あたり 30 億の命令を実行できるわけではありません。考慮すべき点は次のとおりです。

  • 多くの命令は、実行に複数のサイクルを要します (除算または浮動小数点演算は、実行に数十サイクルかかる場合があります)。
  • ほとんどのプログラムは、メモリ アクセスやディスク アクセスなどの待機に大部分の時間を費やしています。
  • OS のオーバーヘッド (スケジューリング、システム コールなど) を含む他の多くの要因も制限要因です。

しかし、一般的にそうです。プロセッサは信じられないほど高速で、短時間で驚くべきことを成し遂げることができます。


それは大きく異なります!大まかな変換を提供しようとしても、私は誰も信じません.

i++; のようなステートメント 単一の INC AX に変換できます .

多くのパラメーターを含む関数呼び出しのステートメントは、スタックが呼び出し用にセットアップされるため、数十の命令になる可能性があります。

次に、コードを記述した方法とは異なる方法でコードをアセンブルし、命令を削除するコンパイラの最適化をそこに追加します。

また、一部の命令は機械語境界でより適切に実行されるため、 NOP s がコード全体に散りばめられます。