アセンブリ言語は、いくつかの大きな概念だけでなく、多くの小さなことを教えてくれると思います。
ここで考えられることをいくつか挙げますが、x86 と RISC 命令セットの両方を使用して学習することに代わるものはありません。
おそらく、整数演算が最速だと思います。整数の整数平方根 (つまり、floor(sqrt(i))) を見つけたい場合は、整数のみの近似ルーチンを使用するのが最善ですよね?
いや。数学コプロセッサ (x86 上) にはfsqrt命令があります。float への変換、平方根の取得、および再び int への変換は、すべて整数のアルゴリズムよりも高速です。
次に、メモリへのアクセスなど、たどることはできますが、アセンブリを詳しく調べるまでは適切に評価できないことがあります。リンクされたリストがあり、リストの最初の要素に、頻繁にアクセスする必要がある変数が含まれているとします。リストはめったに並べ替えられません。その変数にアクセスする必要があるたびに、リストの最初の要素へのポインターをロードし、それを使用して変数をロードする必要があります (使用間で変数のアドレスをレジスターに保持できないと仮定します)。 . 変数をリストの外に格納した場合は、1 回の読み込み操作だけで済みます。
もちろん、いくつかのサイクルを節約することは、最近では通常重要ではありません。しかし、高速である必要があるコードを作成する予定がある場合、この種の知識は、インライン アセンブリと一般的に他の言語の両方に適用できます。
呼び出し規約はどうですか?(一部のアセンブラーはこれを処理します。本物のプログラマーはそれらを使用しません。) 呼び出し元または呼び出し先はスタックをクリーンアップしますか? スタックも使用しますか?レジスタで値を渡すこともできますが、x86 命令セットがおかしいため、特定のものを特定のレジスタで渡す方が適切です。そして、どのレジスタが保持されますか? C コンパイラがそれ自体で実際に最適化できないことの 1 つは、呼び出しです。
戻りアドレスを PUSH してから JMP してプロシージャーに入れるなど、ちょっとしたトリックがあります。プロシージャが戻ると、プッシュされたアドレスに移動します。関数呼び出しに関する通常の考え方からのこの逸脱は、それらの「悟りの状態」のもう 1 つです。革新的な機能を備えたプログラミング言語を設計する場合は、ハードウェアで可能な面白いことを知っておく必要があります。
アセンブリ言語の知識は、コンピューターのセキュリティに関するアーキテクチャ固有のことを教えてくれます。バッファ オーバーフローを悪用する方法、またはカーネル モードに侵入する方法、およびそのような攻撃を防ぐ方法。
次に、自己変更コードの超クールさ、および関連する問題として、再配置やコードへのパッチの適用などのメカニズムがあります (これには、マシン コードの調査も必要です)。
しかし、これらすべてには正しい精神が必要です。置けるような人なら
while(x--)
{
...
}
それが何をするかを学ぶと、それが何をするかを理解するのが難しいと思うなら、アセンブリ言語はおそらくあなたの時間の無駄です.