質問

私は今、組立もちろん取っていて、私たちの家の割り当てをチェックする人は非常に知識をひけらかす古い学校の最適化フリークです。彼が見ている場合例えば、彼は、10%が差し引かれます:

mov ax, 0

の代わりに:

xor ax,ax

それは一度だけ使われている場合でもます。

私は、アセンブリプログラミングでは、完全な初心者ではないが、私は最適化の専門家ではないので、私は(非常に愚かな質問かもしれませんが、私はとにかく頼むよ)何かであなたの助けが必要になります。 私は1か(-1)にレジスタ値を設定する必要がある場合、それはよりよい使用することです。

mov ax, 1

など何かをします:

xor ax,ax
inc ax
私は可能な限り最適化されたとして、それを取得しようとしているので、

私は本当に、良い成績を必要としています。 (私は、時間とコードサイズの両方を最適化する必要がある)

役に立ちましたか?

解決

8086 instructions timings sizeについて簡単にGoogleは、全てのタイミングを持っていると思われた http://8086.tk/ の上げと8086(およびそれ以上)の命令セットのためにサイズ

いいえ、あなたが同様の情報をウェブ上で公式インテルDOCOを見つけることができる疑うます。

あなたの特定の質問の場合:

xor ax,ax
inc ax

は3 + 3 = 6クロックサイクルを取り、2 + 1 = 3バイト、一方

mov ax,1

は4つのクロックサイクルと3つのバイトを要する。

後者は、その場合には優れているので。

<時間>

しかし、あなたはこの男についてあなたの教育機関に話をする必要があります。その乞食の信念のような単純なことのための10%。

あなたは二つの可能性、1より速く、短い方を持っている場合にはどうすべきか確認する必要があります。

彼らはあなたが達成しようとしているものに応じてコードにさまざまな方法があることを認めましたら、

次に、何を達成しようとしていることは可読性と保守性であると真剣に飛んで飛躍を与えることができなかったということを伝えここでは無駄なサイクルまたはバイト程度またはそこに * A

最適化があれば、あなたが一般的に行うものです、あなたはパフォーマンス上の問題を抱えているとき、コードの一部がほぼ完全な状態になった後、 - コードはまだ変更の-無視できない可能性にさらされるとき、それはほとんど常に努力を無駄にしていますます。

何それの価値について、sub ax,axはので、多分あなたがミックスに、次回は彼にいくつかのより多くの仕事を引き起こすことを投げることができ、クロック・サイクルの観点でxor ax,ax並みのように見えるとバイトます。

<サブ> <サブ> *)いや、本当にありませんが、時折通気することの楽しさ: - )

他のヒント

あなたがより良いとオフしている。

MOV AX、1

8086上のあなたがそれを知っていれば、あなたしている追跡レジスタの内容、あなたはおそらく、たとえば、より良い行うことができます場合は、BXはすでにその中に1があります:

MOV AX、BX

か、AHが0であることがわかっている場合:

MOV AL、1

<のp>など。

あなたの状況に応じて、あなたは...

と逃げることができるかもしれ
 sbb ax, ax

キャリーフラグがセットされている場合、キャリーフラグがセットまたは-1されていない場合、結果は、0になります。

上記の例では、あなたの状況には適用されない場合は、私は

を推薦します
xor  ax, ax
inc  ax

方法。それはサイズのために、あなたの教授を満足させなければなりません。お使いのプロセッサは、任意のパイプライニングを採用している場合しかし、私は(私は非常によくその上間違っている可能性が)いくつかのカップリングのような2つの命令の間に遅延があると期待されます。このような結合が存在する場合、速度がそれらの間に別の命令(斧を使用していないもの)を持っているために、わずかにあなたの指示を並べ替えることで、わずかに改善することができます。

希望このことができます。

私は、どのような状況の下でmov [e]ax, 1を使用します。そのエンコーディングは、もはやhackierのxor配列よりもされていない、と私はかなり確信して、それはちょうど約どこでも高速ですよ。 8086は例外を可能にするだけの十分な奇妙で、そしてその事がとても遅いと、このようなマイクロ最適化はほとんど違いになるだろう。しかし、任意の他にどこ:2「簡単に」命令を実行することは、常にあなたがデータハザードと長いパイプラインを考える場合は特に、低速の1を実行するよりもなります。あなたはそう(xorが実行されている)パイプラインのステージNから結果バイパスあなたのCPUの缶がステージにしない限り、あなたはそれを変更した後、非常に次の命令でレジスタを読みしようとしているN-1(INCがありますのロードの登録しようと、あなたが屋台を持っているつもりだ)、その値に1を加算気にしない。

考慮すべき他のもの:命令は、帯域幅(16ビットコードの議論の余地が、3バイトの両方)をフェッチします。 movは(可能性が高いすべてゼロにそれらを強制するよりも有用であるために)フラグを変更する回避します。保持している可能性のある他のレジスタをどの値に応じて、あなたはおそらくlea ax,[bx+1]を行うことができます(また、3バイト、でも32ビットのコードでは、フラグに影響はありません)。他の人が言ってきたように、sbb ax,axは状況にあまりにも仕事ができる - それは2つのバイトでも短いのです。

マイクロ最適化のこれらの種類に直面したとき、あなたが本当にすべきの措置の代わりに盲目的にプロセッサのマニュアルにも、頼るの代替案ます。

P.S。新しい宿題:?xor bx,bxはどの速くxor bx,cxより(任意のプロセッサ上)です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top