アセンブリ言語を学ぶ価値はありますか?[閉まっている]


92

ASMを学ぶ価値はまだありますか?

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

注:HLA(高水準アセンブラー)のようなものではなく、FASMまたはNASMのような低水準のアセンブリについて話しています。


2
アセンブリ言語は、プロセッサ/コントローラに関連付けられていることに注意してください。
rmflow、2011

7
クロスプラットフォームではないということですか?!!
ApprenticeHacker


2
わかりましたので、プロセッサごとに異なるアセンブリ言語がありますか??? !!!!!!!!!!!!!!!!!!!!!!!!!
ApprenticeHacker

3
プロセッサファミリごとに異なるアセンブリ言語。386コードはIntelおよびAMDの製品を含むそれ以降のx86プロセッサで実行されますが、一部の機能セットは独自の拡張機能です。言語は、これらの余分な手順については同じですが、結果のバイナリは移植されません。
散布

回答:


107

Kip Irvineの本から学びました。彼の(無関係な)ライブラリーの(公正な)批判を無視する場合、私はそれを言語自体への良い入門としてお勧めできます- 非常に興味深いもののために、あなたはネット上の強迫観念を探し出さなければなりません。

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

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

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

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

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

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

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

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


7
よく書かれた答え+1。学習と使用は2つの異なるものであり、学習することは良いアイデアです。
old_timer

例を挙げれば、Linus Torvaldsは逆アセンブラを使用してコードをデバッグしているので、x86アセンブリについては十分に理解していると思います。
Ivanzinho

52

非常に多くの人々がそうそう言うためにジャンプするのは面白いと思います。そう、あなたは組み立てを学ぶ必要があります。私にとっての質問は、どのくらいのアセンブリを知る必要があるかです。プログラミング言語のようにアセンブリを知っている必要はないと思います。つまり、すべての人がアセンブリでプログラムを書くことができるとは思いませんが、一方で、それを読んで実際に何を理解できるのでしょうか。 (アセンブラよりもアーキテクチャの知識が必要になる可能性がある)手段で十分です。

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


4
あなたは私が基本的なプッシュ、ポップ、ムーブ、インボークコマンドを学ぶべきだということですか?
ApprenticeHacker

10
同意します。アセンブリを知る必要性は、使用しているプログラミングブランチに大きく依存します。Web /デスクトップ/データベース?アセンブラを忘れます。コンピュータゲームとグラフィックス?多少便利かもしれません。OS開発またはリアルタイム組み込みシステム?必見です。等々。
ランディン

1
あなたは他の答えを誤って伝えている-誰もあなたアセンブリを必要する/学ぶべきだと言っているわけではない。質問に従って、それが有用または価値があるということだけです。あなたの答えはまだ関連しています。
Luc Danton、2011

1
@burningprodigy:私が信じているのは、使用するアセンブラーでの命令の基本的な知識(つまり、引数の順序など)と、いくつかのコマンドの基本的な理解、負荷またはお店です。次に、アセンブリの一部を調べる必要がある場合は、参照を使用して各手順を理解できます。そうすることで、必要な基本を学び始めます。
DavidRodríguez-

1
同意する。特に、最新のCPUでの効率の評価については、アセンブリを知っているだけでは、ほとんど何も得られません。それが目標である場合、コンピュータアーキテクチャの基本のかなりのシェアを備えたアセンブリの少し基本的な知識がはるかに便利です。ほとんどの場合、アセンブリが必要なのは、最適化されたプログラムのダンプを通して、または楽しみのために(つまり、セキュリティ関連、ミニカーネルの作成など)です。しかし、アセンブリの知識のために、最後に設計上の決定を変更したのを思い出せません。
Voo

27

はい-CおよびC ++開発者がアセンブリを学ぶ主な理由は、CおよびC ++コードの内部で何が行われているのかを理解するのに役立つからです。実際にコードをアセンブリで作成するわけではありませんが、コードの逆アセンブリ調べて効率を評価し、 CおよびC ++のさまざまな機能がどのように機能するかを理解できます。


23

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

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

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


そして、ついにそれらすべてを学び、何が起こっているのかを垣間見ることができると思うとき、あなたはJを発見します。
Micha Wiedenmann、

4

ASMを知っていることは、デバッグ時にも役立ちます。「ASMによるエラーのダンプ」しか得られない場合があるためです。


2

あなたがやろうとしていることの中で、それを使うことはありますか?それは、あなたが現在やっていること、またはやろうとしていることで、何らかの形であなたを助けるでしょうか?それらはあなたがあなた自身に尋ねるべき二つの質問です、それらへの答えはあなたの質問への答えです。

より一般的な意味では、はい、私はasm(x86やarmのようなもの)を学ぶ価値があると私は思います。それがどれだけ役立つかは、プログラミングの内容とデバッグの仕方に依存します。


2

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


CPUファミリーに依存しているのでしょうか?
Romeno
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.