1

1つの命令で比較してジャンプできる方法はありますか?

Cコード:
1。2 while(i<10)
{i++}

アセンブリコード:(eax=0)(ecx=10)

  1. .while:
  2. cmp eax, ecx
  3. jge .endofwhile
  4. add eax, 1
  5. jmp .while
  6. .endofwhile:

1つの命令で2行目と3行目を実行する方法はありますか?

4

2 に答える 2

6

はい、テストと分岐を1つの命令として扱うことができます。これを行う方法は、2つの命令として記述し、最新のIntelプロセッサを使用し、いくつかの簡単なルールに従うことです(分岐命令はテスト命令が終了するのと同じ16バイトのコード行に含まれている場合、2つの命令を他の命令で区切ることはできません…)。

このメカニズムはマクロ融合と呼ばれます。マクロ融合が適用される正確な条件を含むより詳細な情報は、Agner Fogのマニュアル(82ページ)から入手できます。

于 2012-11-11T21:29:38.463 に答える
6

2 行目と 3 行目を 1 つの命令で実行する方法はありますか?

逆方向にカウントするように C コードを変更できる場合:

1. i = 10;
2. while(--i >= 0);

次に、(単一の) LOOP opcodeを使用できます。

ただし、LOOP は古い命令であるため、新しい (Pentium++) CPU では非推奨になる可能性があります。「非推奨」とは、「まだサポートされていますが、Pascal の回答に示されているようなより原始的なオペコードを使用するよりも遅い」という意味です。

于 2012-11-11T21:49:06.273 に答える