web-dev-qa-db-ja.com

アセンブリ言語を学ぶ価値はありますか?

[〜#〜] asm [〜#〜]?を学ぶ価値はまだありますか?

私はそれを少し知っていますが、実際にそれを使用したり、適切に学習したりしていません。アセンブラーで学ぶことはすべて、CやC++などの言語で1/10の時間でできるからです。だから、私は本当にASMを学び、使用する必要がありますか?専門的に良いことはありますか?それは私の機知を高めますか?要するに、それは私をより良いプログラマーにしてくれるでしょうか?

注:[〜#〜] fasm [〜#〜]または[〜#〜] nasm [〜#〜]のような低レベルのアセンブリについて話している[〜#〜] hla [〜#〜](高レベルアセンブラー)のようなもの。

83

Kip Irvine's 本から学んだ。彼の(無関係な)ライブラリに対する(公正な)批判を無視するなら、言語自体への良い紹介としてそれをお勧めできます-reallyネット上の強迫観念を追い払わなければならない興味深いもの。

下位レベルで何が起こるかを理解することは有益だと思います。アセンブラーを調べると、CPUパイプライン処理、分岐予測、キャッシュアライメント、SIMD、命令の並べ替えなどについて学習できます。これらの知識は、より良い高レベルのコードを書くのに役立ちます。

さらに、従来の知恵は、ほとんどの場合アセンブリを手動で最適化しようとせず、コンパイラにそれを心配させることです。コンパイラーが生成するねじれたものの例を見ると、従来の知恵が保持される理由をよりよく理解できます。

例:LFSRは、rotate-with-carry命令で高速に実行されます。このような特定のケースでは、コンパイラーがそれを理解するのに十分スマートであるかどうかを発見するのと同じくらい簡単にアセンブラーバージョンを書くことができます。時々 あなたは何かを知っている コンパイラが知らない。

また、書き込みまたは実行、スタックオーバーランなどのセキュリティの問題についての理解も深まります。

いくつかの 並行性 の問題は、命令ごとのレベルで何が起こっているかを認識している場合にのみ明らかになります。

完全なソースコードがない場合、デバッグ時に役立つことがあります。

好奇心の値があります。とにかく仮想機能はどのように実装されますか?アセンブラーでDirectXまたはCOMプログラムを作成しようとしたことがありますか?大きな構造はどのように返されますか、呼び出し関数はそれらにスペースを提供しますか?

次に、グラフィックスハードウェア用の特別なアセンブリ言語がありますが、シェーダー言語は数年前に高レベルになりましたが、問題について別の方法で考えることができるものは何でも良いです。

96
spraff

非常に多くの人がジャンプして、アセンブリを学ぶ必要がある/そうすべきだと言うのに飛び付くことは興味深いと思います。私にとって質問はどのくらいアセンブリを知る必要がありますか?プログラミング言語のようなアセンブリを知る必要はないと思います。つまり、誰もが書くことができるとは思わないAssembly内のプログラムですが、その一方で、それを読んで実際に何を意味するのかを理解できれば十分です(アセンブラーよりもアーキテクチャーの知識が必要な場合があります)。

確かにできませんwrite Assembly(つまり、Assemblyに重要なコードを書く)が、実際のハードウェアアーキテクチャの知識と使用されている呼び出し規約と一緒に読むことができますパフォーマンスを分析し、そのアセンブリのソースであるC++コードの部分を識別するのに十分です。

はい-CおよびC++開発者向けのアセンブリを学ぶ主な理由は、CおよびC++コードの内部で何が起こっているのかを理解するのに役立つからです。実際にAssemblyでコードを書くわけではありませんが、コードの逆アセンブリを見ることができます その効率を評価するために そして、CとC++のさまざまな機能がより良く機能する方法を理解します。

25
sharptooth

多くの異なるパラダイムから、多くの異なる言語を学ぶことは価値があります。 Java、C++、C#、およびPythonの学習は、すべて同じパラダイムのインスタンスであるため、カウントされません。

Assemblyはすべての言語のルート(まあ、ルートに近い)にあるので、私はアセンブリを学ぶ価値があると言っています。

繰り返しになりますが、関数型プログラミング言語、論理プログラミング、スクリプト言語、数学ベースの言語を学ぶことは価値があります。時間があまりないので、選択して選択する必要があります。

22
David Hammen

ASMを知ることは、デバッグ時にも役立ちます。「ASMでエラーをダンプする」だけで済むこともあるからです。

4
ain

どのプログラミングレベルに到達したいかによって異なります。デバッガーを使用する必要がある場合はYES。コンパイラーの動作を知る必要がある場合は、はい。すべてのアセンブラー/デバッガーはCPUに依存しているため、多くの作業があります。x86ファミリーの大きさを確認してください。

2
GJ.

あなたがやろうとしていることで、seはありますか?それは、あなたが現在やっていること、または計画していることにおいて何らかの形であなたを助けるつもりですか?これらはあなた自身に問うべき二つの質問であり、それらに対する答えはあなたの質問に対する答えです。

もっと一般的な意味では、はい、私の意見では、asm(x86やarmのようなもの)を学ぶ価値は十分にあると思います。

2
Necrolis