web-dev-qa-db-ja.com

バイナリはどのようにハードウェアに変換されますか?

コードがアセンブリにコンパイルされる方法を理解しています。アセンブリは1:1バイナリコードへの置き換え。誰かがバイナリがハードウェアにどのように接続されているかを理解するのを手伝ってもらえますか?バイナリはどのように物理的に読み取られて実行されますか? ifステートメントはハードウェアでどのように機能しますか?

から グーグル検索 多分私の質問のタイトルは「バスのラインにバイナリデータをどのように配置するか」しかし、私は確信が持てませんでした。

ありがとう。

22
Nona Urbiz

これは実は楽しい質問だと思います。 「簡単な手順でコンピューターを構築する方法は次のとおりです」と言います。

  • AND、OR、NOT、フリップフロップなどの単純な論理回路から始めます。フリップフロップは、一方がオンの場合、もう一方がオフの場合、またはその逆になるように配置されたトランジスタのペアです。そうすれば、1ビットの情報を「記憶」できるので、1つの2桁の数字を格納していると考えることができます。一部の入力行は、それをいずれかの状態にして、「書き込む」ことができます。

  • たくさんのフリップフロップを用意することで、より大きな数を保存し、それを「レジスタ」と呼ぶことができます。たとえば、レジ​​スタに4つのフリップフロップがある場合、16の可能な組み合わせがあるため、0から15までの数値を保持していると考えることができます。

  • 少し先に進むと、「メモリチップ」を購入できます。つまり、16個のレジスタのように、かなりの数のレジスタがあります。 4本のワイヤーが入っており(「アドレス」ワイヤー)、4本のワイヤーが出ています(「データ」ワイヤー)。したがって、0から15までの数値をアドレスとして入力でき、16個のレジスタの1つを選択します。このレジスタの値は、出力データワイヤに表示されます(したがって、「読み取り」ます)。別の数本のワイヤを使用すると、データがデータワイヤに入力され、レジスタに数値が入力(「書き込み」)される可能性があります。

  • ここで、外部4ビットレジスタ(Rと呼びます)と回路のビットがあると仮定します。

    1. rの値をメモリアドレスに提示します
    2. そのレジスタで4ビット値を読み取り、それをRに移動します
    3. これを何度も繰り返します

メモリにプリロードされている番号に応じて、各アドレスの番号が次のアドレスを決定するため、このことが一連の数値アドレスを循環することがわかります。

今、あなたは多くの方法でこのことを飾ることができます。メモリを拡張して、5ビットのアドレス(32レジスタ)を持つことができます。次に、アドレス回線の1つが外界に接続されている場合、外界に応じて異なる動作をします。それが「有限状態機械」です。

Rレジスタを単純なカウンタに置き換えて、「プログラムカウンタ」と呼ぶことができます。メモリから出てくるデータを取得して「命令」と呼び、そのビットの一部を使用して他のメモリアドレスを読み取り、算術レジスタのセットをロードすることができます。いくつかを使用して、Rレジスタを単にインクリメントするか、新しいアドレスを格納するかを制御できます。それは「ジャンプ」と呼ばれます。

もちろん、これは非常に単純なコンピューターですが、それが大まかに彼らが始めた方法です。

20
Mike Dunlavey

あなたの質問への完全な答えは本を含み、それはかなり厚いものです。

「コード」と言うときは、C++などの高レベルのコンパイル言語を指していると思います。通常、コンパイラはこのコードを機械語、または質問で述べたバイナリに変換します。マネージドコードとアンマネージドコード、pコードなどの説明はすべて避けます。つまり、特定のプロセッサ/オペレーティングシステムを対象とするコンパイラについて話しているだけです。たとえば、Javaはバイトコードと呼ばれる擬似コードにコンパイルされます。また、リンク編集またはリンクの問題全体を回避します。これは、複数のソースモジュールが機械語にコンパイルされ、単一の実行可能プログラムにバインドされる方法です。

さて、これから説明しない内容のほとんどを説明したので、通常は次のようになります。また、「通常」とは、DOS、Linux、またはWindows環境でコンパイルされたほとんどの言語を意味します。ソースコードは機械語に翻訳され、実行可能ファイルに書き出されます。この実行可能ファイルには、多かれ少なかれ、プログラムがメモリ内でどのように見えるかについてのイメージが含まれています。オペレーティングシステムにプログラムを実行するように指示すると、OSの「ロードアンドゴー」に相当するものが実行されます。つまり、実行可能ファイルのメモリイメージがメモリにロードされ、オペレーティングシステムがプログラムの最初の命令に対して機械語のジャンプを実行します。次にCPUは、EXITが検出されるまで、そこからの指示に盲目的に従います。

この全体のジャンプ... EXITの不快感は、最新のOSにとって大幅に単純化されすぎています。ご想像のとおり、CPUが盲目的に従順で、プログラムの指示に従わないと、コンピューターがクラッシュします...またはさらに悪いことになります。これは、初期の多くの誤ったプログラムの運命であり、多くのBSODの主要な貢献者でした。

10
Bob Kaufman

それとコンピュータ組織のテキストを網羅したコードという名前の本があります。ここでの答えはすべて良いです。

4
Recursion

これは巨大で非常に複雑なトピックです。私がこの主題に関して見た中で最高の教科書は パターソン/ヘネシーの「コンピューターの組織とデザイン」 であり、多くの版があります。

あなたがそれを読むことを提案する以外に、私は一学期の長いクラスを500文字の回答ボックスに詰め込もうとはしません。

4
Crashworks

私はこれを巨大で複雑だとは思っていません。ハードウェアに近いほどシンプルになります。

逆アセンブラを作成します。これがハードウェアの動作です。ほとんどのプロセッサには、アセンブラ言語と同じマニュアルにオペコードまたは命令セットが含まれています。

たとえば、レジ​​スタを使用した追加命令のオペコードを見てください。いくつかのビットがソースレジスタを決定し、宛先レジスタのいくつかのビットが、これが追加命令であることを示しています。あなたが見ているこの命令セットがレジスタベースの追加のために2つのレジスタだけを使用するとしましょう。レジスタのサイズの2つの項目を加算し、結果とキャリービットを出力できる加算器というロジックがいくつかあります。レジスタは、フリップフロップと呼ばれることもあるメモリビットのチップに格納されます。したがって、加算がデコードされると、入力レジスタは電子スイッチを使用して加算ロジックに関連付けられます。最近では、これはクロックサイクルの開始時に発生し、クロックサイクルの終了までに加算器が結果を出し、出力がデスティネーションレジスタのビットにルーティングされ、応答がキャプチャされます。通常、addはフラグレジスタのフラグを変更します。結果が大きすぎてレジスタに格納できない場合(10進数の9と1を加算すると、0が1を正しく運ぶとどうなるか考えてみてください)。加算器の出力を調べ、ビットを値ゼロと比較して、フラグレジスタのzフラグを設定またはクリアするロジックがいくつかあります。もう1つのフラグビットは、負の符号ビットまたはnビットです。これは、回答の最上位ビットです。これはすべて並行して行われます。

次に、次の命令がゼロの場合はジャンプ(等しい場合はジャンプ)であるとすると、ロジックはzフラグを調べます。設定されている場合、フェッチされる次の命令は、同じまたは別の加算器を介してプログラムカウンタに追加される命令のビットに基づいています。または、命令のビットが、プログラムカウンタの新しい値を保持するメモリ内のアドレスを指している可能性があります。または、条件がfalseの場合でも、プログラムカウンターは加算器を介して実行されますが、それに追加されるのは、次の命令をフェッチするための命令のサイズです。

逆アセンブラーからシミュレーターまでの範囲は長くはありません。レジスタごとに変数を作成し、命令をデコードし、命令を実行して、続行します。メモリは、読み取りまたは書き込みを行う配列です。逆アセンブラはデコードステップです。シミュレーターはハードウェアと同じステップを実行します。ハードウェアは、さまざまなプログラミングトリックとさまざまなプログラミング言語を使用して並行して実行します。

逆アセンブラがプログラムの最初から始まり、最後まで逆アセンブルする実装方法によっては、シミュレータは最初から始まりますが、必ずしも最初から最後までではないコードの実行に従います。

MAMEのような古いゲームコンソールシミュレーターには、あなたが見ることができるプロセッサーシミュレーターがあります。残念ながら、特にMAMEを使用すると、コードは読みやすさではなく実行速度を重視して設計されており、ほとんどが完全に読み取れません。あなたが見ればそこにいくつかの読みやすいシミュレータがあります。

友人が私にこの本を教えてくれました http://www1.idc.ac.il/tecs/ 読みたいのですが、まだ読んでいません。おそらくそれはあなたが探している本だけです。

確かに、ハードウェアは、フェッチ、デコード、およびシリアル実行に多くのクロックを必要とする些細なステートマシンから進化しました。私の推測では、古典的なフェッチ、デコード、実行を理解しただけで、この質問には十分だと思います。次に、他のより具体的な質問があるかもしれません。あるいは、私が質問を誤解していて、デコーダではなくメモリバスを本当に理解したかったのかもしれません。

3
old_timer

バイナリまたはプログラミング言語を見るとき、本質的に電子システムの電気的活動を説明する、人間が理解できる記号や単語を見ています。最終的には、エネルギーの速度、エネルギーの量、エネルギーの損失、熱と光の生成、およびエネルギーが流れている物質がエネルギーを与えられた結果として受ける変化、およびそれがエネルギーの活動にどのように影響するかそれが流れるとき、それは人間によって理解され、電子機器の一部で操作または利用されます。コンピュータやその他のデバイスである複雑なシステムを理解する上での1つの要素は、その内部を流れる電気が何をしているのかを知ることです。これを知るために、1と0の数字を使用して電気の動作の1つを説明しました。要因を変更したときに何が起こるかを追跡するために、物理要素が何をしているのかを知り、その標準的な説明を与えることができなければなりません。要素/物質/亜原子粒子の制御に寄与すると思われる場合、数字は、他の方法では見ることができない粒子で何が起こっているかを合理化するのに役立ちます。

つまり、Binaryは、数値を使用してハードウェア内の電気の活動を表す視覚的な表現です。それらは電荷の流れであるか、または電荷の流れではありません。電荷はACからD/Cに変換され、帯電した粒子の活動は、クロック、回路を流れるエネルギーの速度、抵抗(エネルギーの損失と熱の生成をもたらす)によって安定化されます。回路の一部がオフになるまでの時間はすべて一緒になり、これらの現象を理解して使用することで、単位時間あたりに流れるエネルギー量を標準化するための測定単位を考え出すことができます。残りのコンピューターコンポーネントは、これらのコンポーネントに流れ込む電荷を操作するトランジスター、コンデンサー、抵抗器の非常に高度なシステムのようなもので、コンポーネントは一時的または低速で電荷をトラップします。コンポーネントが特定のエネルギーレベルに達するまでそれを下げ、次にアークフラッシュが発生して、蓄積されたエネルギーが特定の(高度に制御された)量のeでシステムの別のコンポーネントまたは領域にエネルギーを与えるエネルギー。バイナリの各桁はビットの表現であり、ビットは特定の電気コンポーネント(ここからは信号と呼ばれます)の電気的動作の説明であり、バイトは8個の電気信号です。コンピュータが流入する電気を整然と実用的に利用するには、少なくとも8ビットの電気信号が必要であることが一般的に認められています。

言い換えれば、電気は単に減少し、その動作においてエネルギーが安定し、次に分割され、動作するために電気を必要とする一連のコンポーネントを介して方向付けられ、次に新しく通電されたコンポーネントは人間が望むことを行います。

1
Pat Adams

(大幅に簡略化)

バイナリ(たとえば、マシンコード/ asmの行からのバイナリの文字列)は、たとえばディスクからメモリにロードされます。次に、プロセッサロジックによってメモリコントローラに命令が送信され、メモリの内容がプロセッサのローカルレジスタにロードされます。次に、プロセッサによって実行する命令として解釈されます。

私は大学でマイクロコーディングを行うことで、このレベルのことを学びました。

実際には、プロセッサの複雑さとパワーに応じて、さらに多くのステップが発生する可能性があります。プロセッサはさまざまな部分(ALU、レジスタなど)で構成されており、命令、データ、および処理の取得に協力します。このレベルの理解に興味があり、質問をしたことをお勧めします。コンピュータアーキテクチャに関する本を入手してください。私は大学でタネンバウムによって Structure Computer Organisation を使用しました。

1
Preet Sangha

これは「コンピュータはどのように機能するか」という質問のように見えますが、Googleから得た回答に満足することはまずありません。

バイナリがハードウェアに「接続」される方法の詳細は、実際には基本レベルでのコンピュータ設計の主題です。ハードウェア設計に関するある程度の知識はプログラマーにとって非常に役立ちますが、厳密には必要ありません。

これまでのところ、答えは「大幅に簡略化」されています。なぜなら、そうしなければならないからです。

一般に、説明はonly主題を理解している人には意味があります。それについて私たちにできることはあまりないと思います。

EDIT:おそらく私たちが言える最善のことは、回路はビット値を「格納」するように構成できるため、2進数のビット(0と1)はハードウェアの回路に直接対応することです。これらのビットは回路によって操作できます。

つまり、整数を形成するグループに格納、カウント、追加(および他のすべての基本的な算術関数)、出力、および入力を行うことができます。

簡単に言うと、2進数のビットはハードウェアのトランジスタに対応します。他の人が言っているように、これは非常に単純化されています。ビットを処理するのに複数のトランジスタが必要になることがよくありますが、それはハードウェア設計者の巧妙さに依存します。

1
pavium

SWは、紙に書き留めたように、書かれているSW言語だけではありません。 SWも物理的な形を取ります。ある時点で、概念レベルのソフトウェアが物理レベルのソフトウェアにクロスオーバーします。これは、プログラマーが作業しているSW言語でキーボードにコードを入力し始めたときに発生します。キーストロークがタップされた瞬間から、それはずっと電子です...これは、インターフェースが発生するポイントです。キーボードがタップされた瞬間から、ビジネス全体が電子の操作になります-複雑なように、それがそうであるかもしれないように洗練されたそして独創的な努力。バイナリの0と1の観点から考えることは、高電圧と低電圧の単なる比喩であり、すでにキーストロークを超えた物理的な兆候です。キーボードにIF ... THENの最初の文字として文字Iを入力すると、Iキーを物理的にタップすることによって促される電気インパルスによって、01001001に対応する電圧がレジストリの最初の8スロットに配置されます。これからはエレクトロニクスです。

0
Matthew

テキストエディタで書くすべてのものは、最初に、どのコード(ASCII、...)に関係なく、メモリ(キーボードから生成された電気信号)に保存されます。これらの信号はメモリからコンピューターのモニターに送られ、入力しているソースコードを確認できます。次に、メモリ内のソースコード(電気信号)を読み取り、それをマシンコードに変換するコンパイラ(またはアセンブラ)を実行して、変換された電気信号をメモリの別の領域に保存します(電気信号)。 CPUがマシンコードを読み取るとき、それが見るのは電気信号です。論理レベルがないため、論理レベルを電圧レベルに変換する必要はありません。

0
louro

基本的に、そして非常に大まかに言えば、命令は最終的にメモリに格納され、プログラムカウンタ(PC)レジスタは最初の命令のアドレスを保持します。

プロセッサは、ロードがメモリとレジスタの間でデータを移動できる命令をサポートしています。プロセッサはデータを命令レジスタに移動し、その命令は次のクロックティックで実行されます。

私はその背後にある電気工学を説明する資格がありませんが、おそらくそれを調べることができます。

もちろん、これはすべてかなり単純化されています。最近のプロセッサでは大量の並列処理が行われているため、意味のある方法でそれを理解するふりをすることすらありません。

0
timdev

あなたは興味のあるこのリンクを見つけるかもしれません: http://www.eskimo.com/~ddf/Theory/Micro_Fund/Commands/AssyLnge.html

簡単に説明すると、通常、アプリケーションはメモリ内のある領域にロードされ、プロセッサにはメイン部分または開始部分の開始アドレスが与えられます。

プロセッサは、データの操作とデータの移動という2つのことを実行できるため、必要な値や場所を格納するために、レジスタと呼ばれるマイクロプロセッサ上の特別な部分を使用します。

したがって、ifステートメントの場合、2つの値が等しいかどうか、および等しくない場合はどこに移動するか(等しくない場合は分岐)を指定するコマンドがあります。等しいブランチやより大きいブランチなど、他にもいくつかあります。

これらは議会にあります。

コマンドは適切な引数とともにレジスタに格納され、次のクロックサイクルで計算されます。

これは非常に単純化されていますが、大部分は、アセンブリに表示されるのはマイクロプロセッサに表示されるものです。

詳細に入るのはおそらくStackOverflowの範囲外でしょう。

0
James Black

非常に単純化された方法で、コンピューターは無限ループ(ハードウェアで実装)および単純な算術演算(ハードウェアでも実装)を実行する機能として表すことができます。ループでは、次のことを行います。

  • pCでメモリを読み取ります(PCはインクリメントされるループカウンタです)
  • コマンドとオペランドをデコードします
  • コマンドを実行します
  • 結果をメモリに書き戻す

以上です。また、PCを変更でき、「if ... then ... else」ステートメントに使用される制御コマンドもあります。

0
grigy

この質問は非常に複雑です。私は正確に2度ありますが、まだ表面を引っかいただけです。

すべてがどのように連携するかを紹介したい場合は、MITには、オンラインで確認できる無料のクラスがいくつかあります。 This おそらく1つが最適です。開始しました。

0
Jeff Shattock