web-dev-qa-db-ja.com

機械コードでプログラミングすることを学ぶためのリソース?

JavaからC++まで、そしてCまで、プログラミングと愛情に精通した学生です。私は必要最低限​​の要素に戻り、アセンブリにさらに移動することを考えました。

しかし、驚いたことに、多くの人がCほど高速ではなく、役に立たないと言っています。彼らは、カーネルのプログラミング方法を学ぶか、Cコンパイラを書くことを提案しました。私の夢は、バイナリ(マシンコード)でプログラミングするか、ベアメタル(マイクロコントローラーを物理的にプログラムする)をプログラミングするか、BIOSやブートローダーなどを書くことを学ぶことです。

多くの調査の後に私が聞いた唯一の可能性は、16進エディタがこの時代と時代に私が見つけることができた機械語に最も近いものであることです。他に知らないことはありますか?マシンコードでプログラミングすることを学ぶためのリソースはありますか?できれば、8ビットマイクロコントローラー/マイクロプロセッサー。

これは 質問 は私のものに似ていますが、私はまず実践的な学習に興味があり、次に理論を理解します。

25
AceofSpades

人々はマシンコードでプログラムしないでください(マゾヒスティックでない限り)。彼らは、ツールを使用(または開発)してマシンコード(コンパイラーまたはアセンブラー、クロス開発ツールを含む)、またはおそらくマシンコードを生成するライブラリー(LLVM、libjit、GNU lightning、...)を生成します。 )したがって、マシンコードの生成、コンパイル、オプティマイザ、およびマイクロアーキテクチャに関するリソースも関連しています。

そして、多くの場合、優れた最適化コンパイラーは、あなたができるよりも良いマシンコードを生成します。おそらく、優れたオプティマイザよりも優れた200行のアセンブラコードを記述できないでしょう。

マシンコードを理解したい場合は、最初にアセンブリを学びます。マシンコードに非常に近いです。 C(またはOcaml、Haskell、Common LISP、Scalaなどの一部の高水準言語)でコーディングできない場合にのみ、賢く使用してください。多くの場合、C関数内でasm命令(特にGCC 拡張アセンブリ 機能)を使用することをお勧めします。 (gcc -S -O2 -fverbose-asmによって生成された)アセンブリコードを読み取ることも役立ちます。

Linux Assembly HowTo を読むのは良いことです。

現在のプロセッサの命令セットアーキテクチャ(つまり、チップが理解する命令セット)は非常に複雑です。一般的なものは x86 (32ビットモードの標準的なPC)、-​​ X86-64 (64ビットモードのデスクトップPC)、-​​ [〜#〜] arm [〜#〜] (スマートフォン、...)、 PowerPC など。これらはすべて非常に複雑です(歴史的および経済的な理由により)。おそらく最初に、たとえば、 KnuthのMMIX の方が簡単です。

27

以前に述べたように学習アセンブリ

アセンブリ言語は、コンピュータ、マイクロプロセッサ、マイクロコントローラ、およびその他のプログラム可能なデバイス用の低レベルのプログラミング言語です。これは、特定のCPUアーキテクチャをプログラムするために必要なマシンコードおよびその他の定数の記号表現を実装します。

したがって、アセンブリはsymbolic representation of machine code

さて、「わかりました。どうすればそれをすべて学習できますか?」私はあなたが尋ねたのでとてもうれしいです:

  1. それが何であるかを理解してください。非常に低レベルであり、非常に詳細な情報を提供しますコンピュータの理解。 Wikipedia から始めて、次に この短い文章 を読むことをお勧めします。
  2. それを学ぶ!最良の読み取りはおそらく アセンブリ言語の芸術 および アセンブリ言語のステップバイステップ: Linuxでのプログラミング
  3. コーディングを取得!
13
Dynamic

目標を再考することを強くお勧めします。その理由は次のとおりです。

私は最初にBBCマイクロコンピューター(モデルB、32K)で6502アセンブリ言語を学びました。マクロアセンブラを含むすばらしいBASIC実装がありました。私たちはそれらを学校に置いていたので、マシンが10分間使用されなかった場合に、画面のバッファを直接操作してレミングを部屋の周り(ネットワークに接続されていた)に各画面を横切るようなさまざまないたずらなプログラムを書きました。 。それは私の7年目の友人の間で笑いの発作を引き起こしました。

Commodore 64を自宅で入手したとき、6510 CPUがあり、これも6502アセンブリ言語を実行しましたが、興味深い追加機能がいくつかありました。私はアセンブラー(cartridgeに付属)を購入し、BASIC経由でプログラムを呼び出す必要がありました。ベストセラーのゲームを作成するという壮大なビジョンのもと、私は最終的にいくつかのデモを作成し、ビデオディスプレイハードウェアを割り込みでビット調整して、ファンキーなチップミュージックにアニメーション化される興味深いカラーバー効果を作成しました。印象的ですが、それほど有用ではありません。

その後、ARM2 CPUを搭載したAcorn Archimedes A310を入手したので、組み込みマクロアセンブラを備えた素晴らしいBASIC実装をBBC Micro(同じ遺産)として使用しました。私はなんとか芸術家の友人がグラフィックスを提供するいくつかのゲームと、いくつかの正弦波ベースの奇抜なデモをまとめることができました。これらは両方ともプログラムするのが大変で、不正なコードがマシンをダウンさせ(誤ってハードウェアリセットレジスタをトリップするなど)、保存していなかった場合(フロッピーに!)すべてを失う可能性があります。

大学でC++を紹介されたため、C++を使用して、Sun/Solarisやその他の大規模なメインフレームコンピュータをプログラムすることができました。これらのマシンがどのCPUアーキテクチャで実行されているのかはわかりません。C++ツールがプロのアプリケーションを作成するのに必要なパワーを与えてくれたので、アセンブラを使用したり、マシンコードを読み取る必要はありませんでした。

Uniの後、私はWindowsといくつかの種類のUnixに取り組みました。 CおよびC++はこれらすべてのマシンで動作し、最終的にJavaも動作しました。

次に、デバッグ用の包括的なツールチェーンを備えたDirectXとC++を使用して、WindowsとDreamcastで作業しました。

その後、スマートテレビ用のARMベースのチップセット(2000年)を使用して仕事をしました。 ARM2での私の経験はここで関連性があるかもしれませんが、仕事はCベースでした。私がアルキメデスで行ったハードウェアに関するすべての突っ込みは、単純なビットいじり操作を使用してCでも行うことができることがわかりました。私の役割の一部は、コードベースをWindows、PlayStation 2、Linux、その他のテレビおよびモバイルチップセットに移行することでした。これらのプラットフォームはすべて、Cコンパイラ(多くの場合GCC)と、基盤となるマシンに書き込むためのある程度のAPIの両方で利用可能でした-組み込みの世界がカーネルO/Sになることはめったにありません。ブートローダーとミニBIOSを作成する以外に、特定のプラットフォームの完全なマシンコードを知る必要はありませんでした。どちらも、最初の利用可能な機会にCコードにジャンプしました(トラップベクトルを設定した後、エンディアン性と命令モードおよびスタックの確立)。

次の仕事は、WindowsでC++、C#、JavaScriptを使用することでした。マシンコードはありません。

現在の仕事は、さまざまなプラットフォームでC++、JavaScript、Python、LUA、HTML、その他の言語を扱っています。これらのプラットフォームで実行されるマシンコードもわかりません。知る必要もありません。コンパイラはコードを必要なものに変換します。クラッシュした場合は、デバッガーまたはランタイム診断(例外、シグナルなど)でエラーをキャッチします。

楽しみのために、私は家にいる少し暇なときにiOSアプリケーションを開発しています。 Objective-Cと、複数のチップセットで動作するAPIを使用しています。どうやらそれらはARMベースですが、開発中にマシンコードを目にしたことはありません。

これはアセンブリ言語を学ぶための魅力的な演習ですが、現在では、1桁(または2桁)生産性を高めることができる、より高度なツールと言語があります。

JavaScript、Java、C#、C++、ObjCなどと比較して、すばらしいアセンブリ言語/マシンコードプログラマーが利用できる求人の数はごくわずかです。

これを主な目標ではなく趣味/副業にすることをお勧めします。

8
JBRWilkinson

私のおすすめ? MIPSを学び、(シンプルな)MIPSプロセッサを構築する方法を学びます。見た目よりも簡単です。

他のアーキテクチャーのいくつかに対するMIPSの利点は、単純さです。たくさんの細部にとらわれることはありませんが、他のアーキテクチャでコードを記述するために必要なすべての大きなアイデアを学ぶことができます。

偶然にも、これは私の(3番目の)イントロCSクラスの最後のプロジェクトでした。必要に応じて、 課題 を読み、講義を ビデオ または スライド として閲覧できます。

とりわけ、didは、MIPSコードがバイナリに変換される方法をカバーしています。試験では、いくつかの(非常に単純な)マシンコードをデコードする必要さえありました。

すべてをカバーしたくない場合でも、ほとんどの講義は学生のお気に入りの講師の1人によって提供され、自分で見るのは楽しいです。

6
Tikhon Jelvis

JavaからC++まで、そしてCまで、プログラミングと愛情に精通した学生です。私は必要最低限​​の要素に戻り、アセンブリにさらに移動することを考えました。

とるべき優れた道。 Cからアセンブリーおよびそれ以下へのジャンプ(転倒?)は大学のコースコンピューターの組織とデザインで、同じ名前の に基づいています。

基本的なMIPSアセンブリの最初の章には、パイプライン処理とメモリアーキテクチャに至るまで、この本を強くお勧めします。さらに良いのは、同じテーマのコースを受講するか、オンラインで講義を見つけることです。

また、 MARS MIPS Simulator を参照して、アセンブリの記述を汚してください。

6
Matt Stephenson

マシンが完全に機能する方法を理解したい場合は、可能な限り低いレベルに移動して、現在の場所(C、C++など)まで構築してみませんか?

つまり、回路上にトランジスタを使用して独自の4ビット加算器を構築してみませんか(手順/チュートリアルを探している場合は、Googleでそれを実行してください)。

その後、RAMを備えた小さなコンピュータを構築し、アセンブリの学習を開始して、それを使用して1つまたは2つのプログラムを記述します。

4
Daniel Scocco

Charles Petzoldによるコード は、この主題の非常に優れた紹介であり、加算器、カウンタ、およびRAM配列の構築方法とマシンコードの紹介を含め、コンピュータの構築プロセスを説明しています。アセンブリ言語とその上位レベルの言語との関係コンピューティングの歴史についての素晴らしい読み物でもあります。

そして、私は読んだところ electronics.stackexchangeに関するこの質問 これも役に立つかもしれません

1
br3w5

このために作成された命令セット、シミュレーター、およびレッスンごとの基本的な1つの命令または概念に関するいくつかのチュートリアルがあります。プログラムを入力して実行し、プログラムの機能を学び、次のレッスンに進みます。

http://www.github.com/dwelch67/lsasim

また、いくつかの主流の命令セット用のシミュレーターもあります。 asmの学習に使用するのに適しているもの(x86を学習し、最後に学習し、私がforkしたもののようなシミュレーターを最初に使用して、8088/86を先に進めてください)に適しています。シミュレーターに対する学習には、長所と短所があります。1つは主な長所です。特に、開始時は何もクラッシュせず、優れた可視性を備えています。最初に組み込みプラットフォームやマイクロコントローラーなどに飛び込んで、新しい命令セットを学習することで、何が起こっているのかを理解できないというハードルを克服しなければならず、失敗する方法の長いリストにつながります...

1
old_timer