マシンコードでプログラムすることを学ぶためのリソース?[閉まっている]


24

私はプログラミングから始めて、JavaからC ++、そしてCに至るまで、プログラミングに夢中な学生です。私は、骨組みに戻り、さらにアセンブリに進むと考えました。

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

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

この質問は私の質問に似ていますが、最初に実践的な学習に興味があり、次に理論を理解することに興味があります。


2
どのような正確にここでの問題はありますか?マシンコードでコーディングすることが可能かどうかを尋ねている場合、答えはおそらく「はい」です。チュートリアルを求めている場合は、a)それがあなたの質問であることを明確にしますが、b)それは建設的な質問ではありません。
ChrisF

6
Cは十分な金属ではありませんか?
トムスクワイアズ

6
program bare metalはサーバーボックスを蹴るたびに。驚異の作品!
ヤニス

7
さらに下に行くことを考えたことがありますか?独自のCPUをハックする:opencores.org
SK-logic

3
@ SK-logic、そう、マシンコードのプログラミングは約1時間後には耐えられなくなるでしょう。あなたの言うとおり、より優れた、より生産的なアイデアは、CPUの実装に取り​​掛かることです。仮想6502(のバージョンもありますvisual6502.org)だけでなく、CPUの使用して近代的な個別論理(構築するために持っているか、熱望する人々bradrodriguez.com/papers/piscedu2.htmを
アンジェロ

回答:


27

人々はマシンコードでプログラミングをしません(彼らが自虐的でない限り)。彼らは(または開発)ツールを使用してマシンコードを生成(コンパイラーまたはアセンブラー、クロス開発ツールを含む)、またはおそらくマシンコードを生成するライブラリー(LLVM、libjit、GNU稲妻など)を使用します。そのため、マシンコードの生成、コンパイル、オプティマイザー、およびマイクロアーキテクチャに関するリソースも関連しています。

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

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

Linuxの組立HOWTOは読むことは良いことです。

現在のプロセッサの命令セットアーキテクチャ(つまり、チップが認識する命令セット)は非常に複雑です。一般的なものは、x86(32ビットモードの一般的なPC)、X86-64(64ビットモードのデスクトップPC)、ARM(スマートフォン、...)、PowerPCなどです。これらはすべて非常に複雑です(歴史的で経済的なため)理由)。おそらく最初にKnuthのMMIXなどの仮想的な命令セットを学習する方が簡単です。


8
「人々は(...)Cでプログラムを実行していない彼らはおそらくCバックエンドで、近代的な言語を使用しています。」
Abyx

私は間違いなく同意します。そして、私の現在の仕事プロジェクト(MELT、参照gcc-melt.orgは)C.に翻訳DSLである
バジーレStarynkevitch

私はのISAにいくつかの参照を追加しました
バジーレStarynkevitch

6
アセンブラーを作成したい人はどうですか?機械語を学ぶ理由はありますが、それほど一般的ではありません。
ジェッティ

命令セットアーキテクチャを学習していると言えます(アセンブリニーモニックを使用)。命令の正確なエンコードを明示的に学習することはほとんどありません(たとえば、NOPは0x90です)。多くの人は、アセンブラーまたはマシンコードジェネレーターを作成するときに、それを知る必要があります。(同様に、UnicodeのUTF8エンコーディングを暗記する必要はほとんどありません)。
バジルスタリンケビッチ

13

前に述べたように、アセンブリを学びます。

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

だからアセンブリはsymbolic representation of machine code

あなたは今、「わかりました、それでは私はそれをすべてどうやって学ぶのですか?」あなたが尋ねたのはとてもうれしいです:

  1. それが何であるかを理解してください。これは非常に低レベルであり、コンピューターの非常に深い理解を提供します。ウィキペディアから始めて、この短い文章を読んでみてください。
  2. 勉強しなさい!おそらく最高の読み物は、アセンブリ言語アセンブリ言語の技術ですステップバイステップ:Linuxでのプログラミング
  3. コーディングしてください!

私は、この他のスレッドを読んでいたし、私はこの時につまずく推測:programmers.stackexchange.com/a/82573/43388私は上のチュートリアルを見つけることができるような性質のもの?しかし、移行を容易にするために、最初にアセンブリを学習する必要があります。
AceofSpades

1
おかげで、私は一般的な需要に応じてアセンブリを学ぶ必要があると思います。+1
AceofSpades

8

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

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

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

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

大学ではC ++を紹介されたため、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のようなものに比べて、すばらしいアセンブリ言語/マシンコードプログラマが利用できる仕事の機会はごくわずかです。

これを主な目標ではなく、趣味/関心事にすることをお勧めします。


6
趣味です。私は物事がどのように機能するかに興味があり、可能な場合は非常に基本的なレベルで操作することを学びます。+1
AceofSpades

6

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

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

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

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

すべてをカバーしたくない場合でも、講義のほとんどは学生の好きな講師の一人によって行われ、自分で見るのは楽しいです。


リンクとどこから始めるべきかを説明してくれてありがとう。+1
AceofSpades

6

私はプログラミングから始めて、JavaからC ++、そしてCに至るまで、プログラミングに夢中な学生です。私は、骨組みに戻り、さらにアセンブリに進むと考えました。

取るべき優れた道。CからAssembly以下への私のジャンプ(落下?)は、同じ名前のに基づいた大学のコースComputer Organization and Designでした。

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

また、MARS MIPSシミュレーターを参照して、アセンブリを書くのに手を汚してください。


4

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

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

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


元のポスターがコンピュータをゼロから構築する場合、彼は自分のアセンブリを定義する必要があります(学習するだけではありません)。
バジルスタリンケビッチ

@daniels私は、真の低レベルであるビットから加算を学習することにより、推論を理解しています。+1
AceofSpades

コンピューターをゼロから構築する代わりに、Z80や6502のような古いプロセッサー(およびそのアセンブリ言語)を学習することもできます。プレイできるエミュレータもあると思います。
ジョルジオ

@AceofSpades MinecraftのCPUとCPUコンポーネント(加算器など)を簡単に構築する素晴らしい方法は、レッドストーンを使用することです。これをお勧めします。私はMinecraftでいくつかの簡単なマシンで作業を開始し、コンピューターの背後にある理論と論理についての理解を大いに後押ししました。
アーロン

1

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

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

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


1

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

そして、私はちょうどElectronics.stackexchangeこの質問を読んだことがあります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.