web-dev-qa-db-ja.com

バイナリ/ 16進数からアセンブリ命令セットにどのくらい正確に行くのですか?

だから私は最近、ここで少し埋め込み/アセンブリプログラミングを学ぼうとしているだけでなく、最低レベル(ゲートなど)を学ぼうとしているところもあります。

しかし、私を困惑させるのは、命令セットを「取得」する方法です。ゲート/ TTLなどがどのように機能するかはある程度理解していますが、そこからmov、add、clrなどに移行する方法がわかりません...?

それはおそらく愚かな質問です....しかし、私は最初のマイクロプロセッサ/コントローラに戻って考えて....彼らがどのように正確に命令セットを設計してそれを機能させたのでしょうか?

編集:私は最初のマイクロプロセッサについて話しているふりをしていると思いますが、バイナリから実際に命令セットを作成するにはどうしましたか?

13
user6791

CPUの中心は [〜#〜] alu [〜#〜] です。これは、事前定義された一連の2進数字である命令(MOVなど)を取得し、0、1、または2つのオペランドを取得して、それらに適切な演算を実行します。最も単純な命令は、基本的に何もしないNOP(操作なし)です。もう1つの一般的な操作は、ADD(2つの値を加算する)です。

ALUは、「レジスタ」との間でデータを読み書きします。これらは、CPU内部の小さなメモリロケーションです。命令の一部(使用しているレジスタの数に応じて各入力に2〜3ビット)は、どのレジスタから読み取るかを示します。 ALUの外部のCPUには、必要なデータ(および命令)をメモリからレジスタにロードし、レジスタからの結果をメモリに書き戻すユニットがあります。結果を書き込む場所も、別の2または3ビットにエンコードされます。

操作を表す2進数である「opコード」の選択は任意ではありません。適切に選択されたオペコードは、ALUの複雑さを軽減します。各ビットまたはビットのグループは、ALUの特定の論理ゲートを有効または無効にする傾向があります。たとえば、ADD命令では、出力ステージが内部加算ロジックの結果を選択できるようにする必要があります。同様に、MUL命令は乗算ロジックの結果を選択します。設計によっては、加算回路と乗算回路の両方が実際に入力オペランドに対して演算を実行する可能性が高く、変化するのは出力選択(ALUの出力ビットに書き込まれるもの)のみです。

18
Scott Whitlock

私は文字通りあなたの質問を取り上げ、一般的にコンピュータではなく、マイクロプロセッサを中心に議論します。

すべてのコンピュータには、ある種のマシンコードがあります。命令は、オペコードと1つ以上のオペランドで構成されます。たとえば、Intel 4004(一番最初のマイクロプロセッサ)のADD命令は1000RRRRとしてエンコードされました。ここで、1000はADDのオペコードであり、RRRRはレジスタ番号0-15(バイナリでは0000-1111)を表しています。

16の4ビットレジスタ(INC、ISZ、LD、SUB、XCHGなど)の1つを参照する他のすべての命令も、下位4ビットを使用してレジスタ番号をエンコードし、上位4ビットのさまざまなエンコーディングを指定してオペコード。たとえば、ADD、SUB、LDおよびXCHGは、レジスタフィールドと組み合わせてオペコード1000、1001、1010、および1011(すべてバイナリ)を使用します。パターンを使用して、ロジックを簡素化します。

最初のコンピュータープログラムは手書きで作成され、1と0を手動でエンコードして、機械語でプログラムを作成しました。これは、ROM(読み取り専用メモリ)にプログラムされました。現在、プログラムは通常、マイクロコントローラの場合は電気的に消去可能なフラッシュメモリに書き込まれ、マイクロプロセッサの場合はRAMが不足します。 (後者の場合も、起動には何らかの読み取り専用メモリが必要です。)

機械語は非常に手間がかかるため、ニーモニックなアセンブラ言語を使用して、通常は命令ごとに1行のアセンブリコードを機械語に変換するアセンブラプログラムが開発されました。したがって、10000001の代わりに、ADD R1と記述します。

しかし、最初のアセンブラはマシンコードで作成する必要がありました。次に、独自のアセンブラコードで書き換え、マシン言語バージョンを使用して最初にアセンブルしました。その後、プログラムはそれ自体をアセンブルできます(これはブートストラップと呼ばれます)。

最初のマイクロプロセッサはメインフレームとミニコンピュータが登場してからかなり前に開発され、4004はとにかくアセンブラを実行するのにあまり適していなかったので、Intelはおそらく大型コンピュータの1つで実行するクロスアセンブラを作成し、アセンブリコードを4004をROMにプログラムできるバイナリイメージに変換します。

9
tcrosley

非常に低いレベルのコンピューターは、データパスおよびコントロールで表すことができます。これらを一緒にグーグルすることは、デジタルアーキテクチャ/設計の基本であるため、多くの資料を提供する可能性があります。

私は要約するために最善を尽くします:

ここで述べたように、中心にはALUがあります。ALU(およびCPUの他の部分)について知っておく必要があるのは、さまざまな操作に対して再構成できることです。具体的には、データパスを再構成する機能があります。これは、パラメーターのフェッチ方法、実​​行する操作、およびパラメーターの保存場所です。これら3つを操作できることを想像してみてください-これが私たちのcontrolです。

では、どうすればこれを達成できるでしょうか。すでに述べたように、低レベルのデジタルロジックを利用して、異なるパス用のマルチプレクサを作成できます。マルチプレクサは、入力用のビットのセットを使用して制御されます-これらのビットはどこから取得されますか?命令自体からエンコードされます。要点:mov、addなどの命令は、特定の操作用にデータパスを構成する方法をCPUに指示するビットのセットです。読んでいるもの(mov、add)は人間が読める形式(アセンブリ言語)であり、プログラムはデータパスと操作の手順を定義しています。

これが、この分野の知識が豊富な人にとって、より複雑なプロセスの単純化しすぎである場合は、お詫び申し上げます。参考までに、電気工学スタック交換は非常に低レベルのロジックを扱うため、この質問をするのに最適な場所です。

4
Jon

私があなたの質問を理解するならば、私はビン/ヘックスまたはアセンブリがどのように関連しているかを理解しません。

私はあなたの質問の本質は私が基本的なゲートからどのように取得するのか、そして、または、移動、ロード、保存、追加などの指示にではないことを想定しています。

私は独自の小さな指導セットを持っていますが、基本的なゲートなどから加算と減算がどのように機能するかについての詳細がいくつかあります http://github.com/dwelch67/lsasim =。

Petzoldのコード(何か何か)の本を探してください。小学校への道を歩むかもしれませんが、コンピューターや電子機器とは何の関係もないことから、2進数、16進数、基本的なゲートなどにゆっくりと進みます。

今日、最初からどのように作成するのか、または当時どのようにしてそれを作成したのかについて質問していますか?今日は、命令セットの定義から始めます。あなたはただ座ってそれを書きます、あなたはあなたがロードとストアとムーブとALUのものを持っていなければならない命令のタイプについて考えます、それからレジスターの数、レジスターの大きさ、これは部分的には命令サイズに影響します、と思います命令サイズについて...

プログラムをどのように作成するのですか?テキストエディターの空白の画面から始めますか?必要となる可能性のある変数、関数、プログラミング言語などを解決しようとしているタスクについて、ある程度のアイデアがあります。そして、人それぞれが異なりますが、ある程度はこれを実行します(関数の定義や記述など)。その一部(再利用可能な定義と列挙型、構造体などでヘッダーファイルを作成する)、およびその他の一部(コードのみ、変数とコードで関数を埋める)。そして、さまざまなタスクを循環し、最終的にはコードサイズ、速度、読みやすさ、品質、機能性などのバランスが取れたと感じます。ハードウェアの設計に違いはありません。ハードウェア設計者はプログラミング言語(vhdl、verilog)も使用し、同じプロセスを実行します。プログラミングはソフトウェアとわずかに異なるだけです。主な違いは、ハードウェアプログラムの異なるライン/モジュールが同時に実行され、ソフトウェアが線形に実行されることです。

ソフトウェアプログラムを思いつくのと同じように、欲望、パフォーマンス、サイズ、機能などのバランスをとります。デザインルールを強制したり、上司に決めさせたりすることができます。ソフトウェアデザインと同様に、実装への初期設計では、大きなミスがあり、初期設計に戻って命令セットを変更する必要があることがわかります。コンパイルされたコードの品質、パフォーマンスなどを劇的に改善するいくつかの特定の命令が本当に必要であることを見つけるために、コンパイラーとシミュレートされたプロセッサーがあるかもしれません。

つまり、最初からいくつかの命令セットを発明し、ハードウェア設計のいくつかの経験を使用して、同様のビットパターンを持つ同様の命令をグループ化し、ハードウェア言語プログラミングだけでなく、より簡単にデコードできるようにしましたが、電力とゲートなどすべてを節約しています。いい物。最近、あなたはある種のシミュレーターを作るでしょう、私の理解はARMは最初にソフトウェアシミュレーターでしたが、その後ハードウェアの設計が来ました、それが本当かどうかはわかりませんが、その話に固執しています。これはチームによっては、一部のチームはハードウェアの人々だけで、HDLでプログラミングを始めたい場合もあれば、私のように両方を少ししたい場合もあります。最近では、優れたハードウェア言語シミュレーターが利用できるため、ハードウェアを構築する必要はありません。ハードウェアシミュレーションプログラム/パッケージを使用して、デバッグの多くをコンパイルおよびシミュレーションします。ソフトウェアチームは、命令セット用のアセンブラーおよびコンパイラーを開発し、シミュレートされたramおよびromフィードプログラムを使用してシミュレートされたプロセッサーに送り、それをペースに合わせます。私がしばらく前に作業したプロセッサで完全なLinuxブートをシミュレートしましたが、何時間もかかりましたが、動作しました(その方法でロジックにキャッシュバグが見つかりました)。

だから今私があなたが本当に求めていたと思うことについて。基本的なゲートから命令セットを備えたプロセッサにどうやって行きますか。基本的なゲートAND、OR、NOT、本当にアナログではありません。時間の概念はありません。入力の電圧を瞬時に変更することはできません。その電圧を変更すると、出力が変化し始めます。ゲートはトランジスタで構成され、トランジスタはアンプであり、入力に数を掛けて、反対側にそのような電流を流します。これらを論理ゲートとして使用すると、実際には過飽和になり、入力電圧が高すぎたり低すぎたりして、トランジスターが最大電圧しか駆動できないか、電圧(電流)を駆動できません。基本的に、トランジットはスイッチに変わります。要するに、時間という概念はありません。命令セットを取得するには、プログラム全体でシーケンスを実行するために命令を実行する必要があります。今、この命令を実行し、次のタイムスロットでその命令を実行するという概念が必要です。アンプをスイッチに変えるゲームと同じように、基本的な論理ゲートとクロックを使用して同様のゲームをプレイします。クロックは、一定の速度でオン/オフする電圧を作る缶の中にある魔法の水晶から来ます(ここに入る価値はありません)。その電圧を論理式で使用すると、シーケンスを開始できます。

非常に簡単にこの真理値表について考えてみましょう。

0 0 0
0 1 1
1 0 1
1 1 0

バイナリで:

0 + 0 = 1
0 + 1 = 1
1 + 0 = 1
1 + 1 = 10 (2 decimal)

上記の真理値表は、1ビット加算器であるlsbitのみに焦点を当てており、1ビット加算器について説明しています。また、XORゲートについても説明します。一方の入力は真であり、他方は真ではありませんが、両方ではありません。

複数のビットを取得するには、キャリービットのキャリーインとキャリーを確認する必要があります。3ビット加算器2オペランドと2つの出力を持つキャリーイン、キャリーおよび結果ビットが必要です。 3入力2出力の加算器を取得したら、必要なだけ幅をカスケードできます。しかし、これはまだアナログであり、ゲートは即座に変化します。

このアナログ加算器をどのようにADD命令に変換するかというと、配置したこれらのゲートへの入力として座っている命令を調べるロジックがあります。命令の一部のビットは、これは加算命令であり、一部のビットは、一方のオペランドがそのようなレジスタであり、そのようなレジスタ、おそらくレジスタ7であると言い、その他のビットは、もう一方のオペランドがレジスタ4であると言っている場合があります。結果をレジスター2に置くという命令で別のレジスターが定義されている可能性があります。レジスタ7の内容をALU加算器の1つの入力にルーティングし、レジスター4の入力を加算器にルーティングする必要があるため、より多くのロジックがこれを認識します。レジスタ2への加算器の出力。クロックはこのロジックの一部であるため、クロック周期の開始から次のクロック周期の開始までの期間があり、すべてのアナログ信号が落ち着いてロジック方程式を解決します。彼らは行うために配線されています。ライトスイッチを切り替えると、ライトの状態をオフからオンに変更します。その光が温まり、基本的に定常状態になるまでには時間がかかります。ここではそれほど違いはありません。

このクロック周期がAND命令の実行フェーズである場合、次のクロック周期で結果を出力レジスタに保存するようなロジックがいくつかあります。同時に、次の命令などをフェッチします。したがって、アナログロジックがロジック方程式を高速に解決できるため、ALUの実行が1クロック周期であることが多い現代のプロセッサでは、いくつかの数まで数える必要があった古いプロセッサは、加算器を配線したままにし、加算器ロジックが解決するまでxクロックサイクル待機してから、出力から結果をサンプリングし、ALUの異なる入力を供給し、xクロックサイクル待機します。それを解決するには、永遠に、または電源が切れるまで繰り返します。

論理方程式とはどういう意味ですか?ちょうどそれが必要な場合は、AND、OR、NOTゲートの観点から考えることができます。 ALU加算回路への各入力ビットには、現在の命令を含むフリップフロップ(個々の/単一のメモリビット)を含む、クロックを含む非常に長い方程式である方程式(およびそれらのそれぞれに供給する方程式)がありますメモリビット)とオンとオン。作成した単一のソフトウェア関数を、作成した言語で受け取ります。これは、入力を受け取り、タスクを実行して、結果を終了して返す関数であると想定します。入力のすべての可能な組み合わせと、その関数を介したさまざまな実行パスについて考えてください。高級言語で書いたかもしれませんが、おそらくその言語でも、多くのネストされたif-then-else構造を使用して、より原始的でより原始的なものに書き直すことができます。おそらくアセンブリ言語に降りてください。私が話している方程式とは異なり、ハードウェアプログラマーは、選択したプログラミング言語がその多くを保存している場合に、アセンブリ言語で長く曲がったif-then-elseツリーでプログラムするよりも、これらの長く曲がった方程式でプログラムしません。使用するコンパイラーが小さなソースコードをたくさんのif-then-elsesを含む長い時間のアセンブリに変換するのと同じように、ハードウェアプログラミング言語コードを取り、それを論理方程式に変換するコンパイラーがあります。 Cで記述された(移植可能にする)1つのプログラムをさまざまな命令セット用にコンパイルするのと同じように、チップを構築する場所や、cpldまたはfpgaを使用する場合のプログラム可能なチップによって、アセンブリコードとマシンコードは異なります。ハードウェアプログラマープログラムを使用して、そのチップビルダーまたはプログラム可能なデバイスから利用可能な論理ブロックに基づいて、論理方程式のさまざまなリストに解決します。

最初のCPUに戻ります(今日はマイクロコントローラーと見なしますが、それはCPUでした)。上記すべてを紙で行い、実際に論理式を記述したハードウェアプログラミング言語を使用しなかったが、命令のビットパターンをさらに慎重に選択して、ゲートの数とそれらのゲートを接続するワイヤを単純にする実用的。紙の上では、手作業で配線された論理ゲートの長いリストを作成し、実際のコンポーネントを爆破されたバージョンのシリコンマスクに描画する必要がありました。今日でもチップは素人の言葉で写真やシルクスクリーンのようなプロセスに似ているものを使用して作られているので、これらのブループリントを取り、それを縮小してシリコン層に適用します。

ここで再び、誰もがアセンブリをよりよく扱えた日に戻ります。最終的には、アセンブリプログラミングを行うだけでなく、テキストエディターもアセンブラーもなければ、紙に手書きで最初のプログラムを書く必要があったかもしれません。リファレンスマニュアルを使用して、手動でそれを機械語の1と0に変換しました。これらのコンピューターの一部では、スイッチを反転してRAMをロードし、アドレスビットを反転し、データビットを反転して紙の数値と一致させ、クロックビットを上下に反転させて、1つのメモリロケーションをロードする必要がありました。プログラムの1つの命令の1バイト、数百回以上繰り返して、間違いがないことを望みます。

最初のCコンパイラがおそらく他の言語で書かれたと同じように、Cで書き直されて最初のCコンパイラでコンパイルされ、その後再び自分でコンパイルされることで、セルフホスティングになりました。次に、Cコンパイラを使用して他のプログラミング言語を発明し、それがセルフホスティングになりました。私たちは自分たちで構築されたオペレーティングシステムとテキストエディタを発明しました、そしてそれは隅のカーテンの後ろの数人の人々が行うすべての黒魔術です...

はい、非常に長続きします。本当に理解するには、何年にもわたる研究と経験が必要な大きな問題です。私のlsasimを見て、私は何でも専門家であると主張していませんが、これは命令セットです。Cで記述された命令を実行するシミュレータと、ハードウェアプログラミング言語で実装されたプロセッサの別の実装の両方があります。さまざまなツールを使用してシミュレーション。加えて、粗雑なアセンブラーと他のいくつかのツールなど。おそらく、これのいくつか、特にハードウェアプログラミング言語のコードを調べることにより、私があなたが求めていたと私が思うものとのギャップを埋めるかもしれません。私がそのギャップを閉じていない場合、または長い接線を作成している場合は、この回答を削除することを知らせてください(プログラマーの交換でたむろすることはできないと想定しています)。

3
old_timer

CPUは0と1で動作します。すべての命令には、それらを定義するビットのシーケンスがありました。これはマシンコードでした。人間にとって読み書きが難しい。最初のステップとして、0と1を4ビットのシーケンスにグループ化し、それらを表すために0からFを使用しました。これにより、記憶する必要のある数は減りましたが、命令の16進コードを覚えるのは容易ではありませんでした。

そこで、MOVやADDなどの「単語」を含むアセンブリの使用を開始しました。アセンブラは、命令を0 'と1'の正しいセットに置き換えて、アセンブリの「リスト」をマシンコードに変換します。

最終的には、「命令」がマシンコードのシーケンス全体を表すことができる「高」レベルの言語を開発しました。

2
Jim C

私は最近このQ/Aに出会い、約1年ほど前にこの道を進み始めました。私自身の関連する質問に関して、これは非常に優れたリソースおよびリファレンスページであることがわかりました。


パート1:-序文-

私自身について少し:

私がまだ小学校にいた80年代半ばから後半にかけて、私は50年代から80年代までのジャンクステレオ、VCR、およびその他の電子機器を分解し、回路基板を見て常にその方法を知りたかった仕事...彼らは実際にどのようにして放送信号を取得し、オーディオ、ビデオを生成し、これなどを行いましたか?抵抗器、コンデンサ、ダイオード、トランジスタなどの個々の部品をあちこちで認識できましたが、彼らが何をしたか、彼らがそのような若い年齢でどのように機能したかを知っています。

私は何年にもわたって、数学、物理学、化学で常に卓越してきました。私は数学を高度に理解しており、中学時代と高校時代からの単純な回路や基本的な回路を読むことさえできましたが、論理ゲートとその構造については理解できませんでした。私の論理学、確率学、統計学の名誉クラスから高校でブール代数を学びます。私の数学と科学のクラスはすべて優等クラスでした。コミュニティカレッジの2学期までは、微積分学を採用しませんでした。私はカレッジ代数でテストし、三角法を復習コースとして取り入れました。教室での私の最高レベルの数学は、単一変数の微積分IIです。

私は3歳か4歳の頃からビデオゲームをプレイしています。子供の頃、私はアタリ、ファミコン、セガジェネシス、PS1を持っていました。年を取り、10代後半と20代前半になると、PS2とSNESを好みのタイトルで購入しました。これは、DoomまでさかのぼるPCゲームも考慮していません。

私は常に熱心なコンソールおよびPCゲーマーであり、これにはピンボールゲームやアーケードゲームは含まれません。

私は90年代初頭のクリスマスに12歳くらいのときに最初のPCを受け取りました。 DOS 6.0と、Win 3.11またはOS/2の時代。それ以来、私は常に「Windows」ファミリーのオペレーティングシステムに精通しており、私が持っていたシステムはすべてIntelアーキテクチャでした。私はAppleまたは学校や大学のMacでの経験が限られていましたが、Linuxシステムで作業する特権がありませんでした。私はCygwinを持っていて、bashを学ぶために手を試してみました、しかし私はDosやコマンドプロンプト構文にとても慣れています。

90年代の初めには、PCワールドのコピーを1つか2つ取得し、よく知らなかったQBasicにコードスニペットを入力して、それらのプログラムを動作させようとしました。成功したのは、ホームのキー列でのキー操作を別の着信音に変えるプログラムだけでした。携帯電話の着信音という意味ではありません。キーを押し続けている限り、継続的な周波数です。

電子回路がデジタルおよび論理レベルで回路内でどのように機能するかを知りたいだけでなく、コンピューターをプログラムする方法を学びたいというのは常に私の情熱でしたが、私はいつも自分のビデオを作りたいと思っていましたゲーム。 90年代初頭にさえ、フロガーとテトリスのゲームを作りたかった...


これが私の主な動機となり、コンピュータサイエンスの分野で最も難しいタイプのプログラミングまたはソフトウェア開発の1つ、つまり3Dゲームエンジンの設計に取り組む意欲となりました。コンピューターサイエンスには他にも同じくらい難しい分野がありますが、個々のコンポーネントやサブエンジンには技術やプロパティが必要であるため、洗練されたゲームエンジンには通常または通常、それらのほとんどすべてが含まれます。

私は高校時代のプログラミングの経験がありましたが、これは恐ろしいVisual Basicに限定されていました。 2002年から2003年頃に1999年に高校を卒業してから数年後まで、C/C++を習得し始めました。今日まで、コンピュータサイエンスやコンピュータエンジニアリングのカレッジクラスの経験はありませんが、献身と決意、コンピューター、ハードウェア、プログラミング、アルゴリズムなどに関するあらゆる概念について学びましたが、できる限り多くのことを学び続けています...

C/C++を習得した初期の頃はインターネットにアクセスできましたが、インターネットは初期段階にあり、Amazon、Youtube、FacebookなどのWebサイトはまだ存在していませんでした。それでも56kの時代でした。 2番目の専用回線がない場合は、電話回線を満杯にするモデムをダイヤルアップします。画像が画面に表示されるまで数分かかりますが、ビデオの連続再生は問題ありません。

したがって、C++でプログラミングする方法の研究と学習に関しては、リソースは限られており、ほとんどがテキスト形式でした。初期のインターネットチュートリアルの日からプロジェクトに取り組むとき、それらのプロジェクトの多くは完全に完了しておらず、作家は専門家または大学生であり、読者はコンパイルなどの必要な概念の多くにすでに精通しているという多くの仮定をしました、リンク、デバッグ、ライブラリ統合。

それらのトピックについて何も知らない人にとっては、何がうまくいかなかったのか、どのように修正し、どのように正しく機能させるのかがわからないため、途方に暮れています。リソースが非常に限られた当時は、何時間もの試行錯誤が必要でした。このWebサイトで今できるようなヘルプを求めたり、 cppreference で見つけられる詳細な説明を探したりできませんでした!個人的に誰も知らなかったとしたら、支援を求められる人はそれほど多くありませんでした。

時が経つにつれ、私の知識の一部はあちこちで改善され、最終的にはインターネットがDSLに改善され、今では高速インターネット、ウェブサイトがよりインタラクティブになり、ビデオが表示されるようになり、ビデオの品質は時間とともに向上しました。 Youtubeが現れ始め、物事は研究側で少し楽になった。ますます多くのチュートリアルがすぐに利用可能になり、他の人が悪い習慣を教えたところ、いくつかは良いもので便利でした...

また、開発に必要なツールを見つけて入手するために多くの時間を費やしました。言語の構文、コンパイラとコンパイルのプロセス、リンク、ビルド、デバッグを学ぶ必要がありました。次に、そこにあるさまざまな利用可能なライブラリとAPI、およびプロジェクトやソリューションを構成してそれらの依存関係をすべてリンクする方法について学ぶ必要がありました。

何年にもわたって、C++言語が成長し、進化し、時間とともに適応するのを見てきました。最初は長年ほぼ同じままでしたが、過去10年間で、当初からこの短いスパンの中で劇的に変化しています。

C++は、その汎用性、パワー、豊富な機能セット、そして足元で自分を撃つことを可能にする能力のために、完全に習得するのが最も難しい言語の1つであるため、これらすべてについて言及します!また、すべての注意事項がありますが、このタイプの開発の標準として業界トップの業界で使用されている最も強力で推奨される言語の1つです。正しく行われると、高速、簡潔、信頼性が高く、最小のフットプリント。

それ以来、私は長年、C/C++で3Dグラフィックスプログラミングとゲームエンジンの設計を学ぶことに専念し、独学で学びました。私は、数百時間から数千時間の検索、研究などを行い、その知識を読み、学習し、有用な実用的な製品とアプリケーションの設計に適用しました。私は常に自分のスキルセットとクラフトを改善するためにもっと学びたいという意欲と欲望を持っています。


これが最初のステージでした。それから、私は最初にDirectX 9.cを読んで作業し始めました。これは、C/C++やC#でさえ行っていました。次に、DirectX 10とLegacy OpenGL 1.0に移行しました。彼らの来たDirectX 11とOpenGL 3.x-4.xから、そして今私はVulkanで自分の手を試してみました。

テキスト形式とビデオ形式の両方で、さまざまなオンラインチュートリアルを使用して、成功したゲームエンジンを構築しました。私はすでに数学の強いバックグラウンドがあると述べましたが、それは微積分I&IIに限定されていました。私は大学で微積分ベースの物理学のクラスからいくつかの知識を持っていたベクトル計算を自分で教える必要がありましたが、アフィン変換と解析幾何学を使用した線形代数については、特定の方程式、関数、メソッド、アルゴリズム、および概念が必要でした。次に、それらを効率的で読みやすく、信頼性が高く、再利用可能なコードに変換する方法を学ぶ必要がありました。このコードは一般的でバグがなく、可能な限り数百から数千時間のデバッグが可能です。

それは、メモリ管理、参照カウント、インスタンス化、再帰など、それらが広大なゲームエンジンのすべてではないにしても多くのコンポーネント内で使用されるトピックやアルゴリズムを学ぶ素晴らしい旅でした。ここにそれらすべてをリストすることもできますが、これは3または4の回答スペースを埋めるのに十分な情報です。ただし、サブトピックではなく一般的なトピックのリストを含めます。

さまざまなレンダリング技術のすべてを含む完全に機能するゲームエンジン、レンダリングおよびシェーダーパイプラインの設定、シェーダーを介したシェーディングおよびライティング技術、前処理および後処理、フレームバッファー、バックバッファーで構成されるトピックまたはサブジェクトリストを以下に示します。 、画像の読み込み、音声とモデルの読み込みと解析、カラーマテリアルプロパティによるプリミティブシェイプの作成、手動によるテクスチャマッピングによるテクスチャと法線座標、オブジェクト変換、カメラタイプ、シーングラフ階層、テクスチャ、オーディオ、フォント、シェーダーのマネージャークラスメモリ管理、例外処理を備えたロギングシステム、マルチスレッドおよび並列プログラミング技術、ネットワーキング、物理エンジン、衝突検出、パーティクルジェネレーター、アニメーション、ゲームAI、地形生成、スカイボックスとスカイドーム、ウォーターレンダリング、葉など。 。、テキストレンダリング、HUDオーバーレイ、インベントリ、マップとマクロの生成、状態システムと状態マシン、およびフィーナ用のテクスチャフォント付きGUI llyパーサーを作成して独自のスクリプト言語を作成し、これらのオブジェクトの多くを自動化して、エンジン内のデータ値を変更することができます。データファイルに読み込むだけで再コンパイルする必要はありません。アプリケーションの起動。


何年にもわたって、私はコンパイラー、アセンブラー、および単純なオペレーティングシステムについて学びたいという彼らから、アセンブリー言語を学びたいと興味をそそられてきました。つまり、それらの内部の仕組み、それらがどのように構築および設計されるかを意味します。

時が経ち、私は少し歩を進めて、ハードウェアエミュレーションを学び始めました。私は特にNESに焦点を当てましたが、CPUのハードウェアエミュレーション全般を学びたいと考えました。これにより、私はすでにIntelのx86ファミリにある程度精通しているため、概念とその内容をすでに理解している命令セットについて学びましたが、6502命令セットを学ぶ必要がありました。

しかし、これに飛び込むことで、私はより多くの研究を行うことになり、エンジニアリングの観点から命令セットアーキテクチャについて学び始めました。これにより、CPUがロジックゲートからどのように構築されているか、およびロジックゲートがトランジスタやその他のさまざまな電気コンポーネントからどのように構築されているかを知ることができました。そのため、私はこのことについて、トップダウンとボトムアップの2つの視点から学ぶことになりました。どちらの方法も非常に効果的であり、両方から学ぶことは、ソフトウェアがハードウェアに負担をかける橋やギャップを構築するのに役立つと思います。

これから、私はブール代数を更新する必要があり、Kマップ、含意テーブル、MealyとMooreの両方のステートマシン、およびバイナリロジックと算術を物理論理ゲートと集積回路に関連付ける他のさまざまなことについて学びました。そして、これは私がLogisimで働き始め、HDL、VHDL、Verilogなどを学び始めた最近の過去に私を連れて行きます...

私は、この15〜18年間、できる限りの時間に、これらすべてを学んでいます。


ここに私が長年にわたって私を導いてきたサイトとリンクのいくつかがあります。これらの多くは、私が最初に学んだサイトの多くがもはや存在しないか、リンクを失い、覚えていないか、検索エンジンが検索リストのはるか後ろにそれらを押し込んだため、最近のものです...

  • 言語-C++

  • 3DグラフィックチュートリアルとリソースWebサイト

  • Youtubeシリーズとチャンネルこれらは、ハードウェア、コンピュータ、電気工学だけでなく、上記のトピックをカバーしています。リストするには数が多すぎるので、ここではそれらのいくつかをリストします。ここでは、最も便利で機知に富んでいると思います。リンクは提供しませんが、これらのチャンネルをYouTubeで検索できます。

    • 3Blue1Brown-高度な数学
    • Bisqwit-高度なC/C++プログラミング(アプリケーションプロジェクト)-NESハードウェアエミュレータ
    • Jason Turner-Advanced Modern C++プログラミング技術
    • javidx9-高度なC/C++プログラミング(アプリケーションプロジェクト)-NESハードウェアエミュレータ/一部のアセンブリ
    • MIT OpenCourse-数学とコンピューターサイエンスのカレッジコース
    • Bilkent Onlineコース-コンピュータサイエンスおよびコンピュータエンジニアリングの大学コース(CPU Design MIPS)
    • Cherno-高度なC/C++プログラミングのトピックとアプリケーション-ゲームエンジンの開発
    • Ben Eater-ハードウェアエンジニアリング-ブレッドボードを介した実用的なアプリケーション
    • Neso Academy-ハードウェアエンジニアリング-理論と概念
    • Socratica-Pythonプログラミング
    • Simply Put-ハードウェアエンジニアリング-理論と概念
    • Bitwise-ハードウェアエミュレーションによる高度なC/C++アセンブラの設計
    • Bo Qian-データ構造とアルゴリズムのC++トピック。
    • LineByLine-Vulkanプログラミング
    • Joshua Shucker-Vulkanプログラミング
    • www.MarekKnows.com-C++、3D数学およびゲームエンジンの開発

そして、これらは私がこれらのトピックについて持っている様々な本のいくつかを考慮に入れていません。

-注-これは私の個人的な経験の読者へのメッセージにすぎず、元の質問に答えたり参照したりする試みは行われていないため、これには投票しないでください。時間がある次の数日で。 OPの質問についての私の考えを与えるためのフォローアップの回答を追加し、参照およびリソースのセットとして有用なリンクを提供します。また、この回答を更新して、ここにいくつかのリンクを含め、このメモを変更します。遅いので、今書いたものを校正して編集する時間はありません。できればやります」

0
Francis Cugler