2016-09-28 4 views
0

これは非常に新しいMIPSコーダーの非常に一般的な質問ですが、CからMIPSへコードを変換する場合、命令カウントは実装に基づいて変化するのですか、それとも常に同じですか?例えば、私はそれを見つけるために、式を使用:MIPS命令のカウントは実装によって変更されますか?

for(i=0; i<a; i++) 
for(j=0; j<b; j++) 
D[4*j] = i+j; 

私の命令数は、(4 * A)+(8 * A * B)4。しかし、それは実際にコードを書いた方法に応じて変わるだろうか?ありがとう!

+0

ここでの「コード」とは、Cコード(どのように書いても問題ありませんが、コンパイラが何をするかが重要です)またはアセンブリです(明らかに別のことを書いて、結果が異なります)。 – harold

+0

コードによって、私はアセンブリを意味しますが、特にisaとコンパイラによって決定される命令カウントの定義を参照しています。そして、基本的には、命令数を変更する方法があるかどうかを尋ねていました。IEのコードはさまざまな方法で作成されていました。したがって、命令が少なくなったり、同じ数の命令を実行したければ、さらに時間をかけてください。 – SN44

+0

シングル命令レベルでも、別の命令で同じ結果。 2で割り切れる値は、DIVまたはビットを右にシフトすることによって行うことができ、値の結果は同じです(ただし、シフトは余りを生成しません)。 Cでは、大きな違いを見るための簡単な方法は、単に "デバッグ"ビルド対 "最適化"ビルドのマシンコードをチェックすることです。アセンブリーでは、プログラマーはより多くの制御を行います。通常、アセンブリーはほとんどがinstの1:1マッピングであるため、コンパイル後のマシンコードは何かをソースから判断することができます。オペコードを機械化するニーモニック(疑似instを除く)。 – Ped7g

答えて

1

もちろん、何かを行う方法はほとんどありません。

例えば、これらのループの場合、上部にテストがあり、無条件でジャンプバックする「退屈な」方法があります。下部にテストがあり、無条件でジャンプすると「やや賢い」フォーム"ループの前に"直接テストに。これはループインバージョンの特別な形式で、これ以上のコードは必要ありませんが、反復回数がゼロでない限り、動的に実行される命令が少なくなります(jはループにはなく、1回だけ発生します)。

もっと一般的には、ローカル変数を常にレジスタに保持するか、メモリ内でさまざまな時間を費やすように決めることができます(「割り当てごとに使用するたびに保存する」からあなたが削除したい無意味なロードとストア)。

このストーリーの「あなた」は、あまりにも明らかにコンパイラになる可能性があります。そしてあなた(現実のあなた)は、通常、それが特定のフラグを与えることによって何個の命令を出すかを操作することができます。通常、最適化を一切行わないように指示すると、コンパイラは変数の使用ごとに負荷を発生させ、すべての割り当てに格納しますが、ゼロ以外の最適化ではそうするべきではありません。

関連する問題