私は今、組み立てコースを受講しているのですが、宿題をチェックする人は非常に細かいことにこだわる昔ながらの最適化マニアです。たとえば、次のような場合は 10% 減点します。
mov ax, 0
の代わりに:
xor ax,ax
たとえ一度しか使用されなかったとしても。
私はアセンブリプログラミングの完全な初心者ではありませんが、最適化の専門家でもありません。そのため、あることについてあなたの助けが必要です (非常に愚かな質問かもしれませんが、とにかく尋ねます)。レジスタ値を 1 または (-1) に設定する必要がある場合、次を使用する方がよいでしょう。
mov ax, 1
または次のようにします:
xor ax,ax
inc ax
本当に良い成績が必要なので、できるだけ最適化するようにしています。(時間とコード サイズの両方を最適化する必要があります)
ベストアンサー1
グーグルで8086 instructions timings size
調べてみると指示タイミングのリスト8086/8088 から Pentium までのすべてのタイミングとサイズが含まれているようです。
ただし、これはおそらく、特に8088では非常に重大なコードフェッチメモリのボトルネックを含まないことに注意してください。これにより、コードサイズの最適化がより良い選択になります。こここれに関する詳細については、こちらをご覧ください。
間違いなく、Web 上で「8086/8088 ユーザーズ マニュアル: プログラマーおよびハードウェア リファレンス」などの同様の情報が記載された Intel の公式ドキュメントが見つかるでしょう。
あなたのための特定の質問に対して、以下の表は後者の方が優れていることを示す比較を示しています(サイクルが少なく、スペースは同じです)。
説明書 | クロックサイクル | バイト |
---|---|---|
xor 斧、斧 インク斧 |
3 3 --- 6 |
2 1 --- 3 |
斧を動かす、1 | 4 | 3 |
しかし、この件については教育機関に相談した方がいいかもしれません。このような単純なことで10%の罰金を課すのは、かなり厳しいように思います。二可能性は、1つはより速く、もう1つはより短いです。
そして、彼らが認めたら違う達成したいことに応じてコードを最適化する方法を教えてください。あなたはやろうとしているのは、読みやすさと保守性を最適化することであり、あちこちで無駄にされているサイクルやバイトについてはまったく気にしないということです(1)。
最適化は、一般的に次のような場合に行うものです。持っているコードの一部がほぼ完成した状態になった後にパフォーマンスの問題が発生する場合、コードがまだ変更される可能性が少なからずある場合は、ほとんどの場合、無駄な労力になります。
sub ax,ax
クロックサイクルとサイズに関しては同等のようですのでxor ax,ax
、次回はそれを混ぜて、彼に何か起こしてもらうのもいいかもしれません。もっと仕事。
(1)いや、本当にそんなことはしないけど、たまには発散するのも楽しいよ :-)