9

マシンコードが実際に何であるかについては多くの意見があるようです。アセンブリ、バイナリ、または16進数だと言う人もいます。

マシンコードは本質的に特定のプロセッサ用の一連の命令であると言うのは正しいですか?もしそうなら、私はこれらが2進数または16進数の表記法、またはアセンブリで表すことができると思います。しかし、翻訳されていない「実際の」機械語はどのように見えるのでしょうか。アーキテクチャのワードサイズに基づいていますか?または、すべての目的と目的で16進数がデフォルトの表現ですか?

ハードドライブに座っているときはどのように見えますか?レジスターに座っているときはどのように見えますか?それが処理されているときはどうですか、それは単にその時点での一連の電圧変化ですか?

4

3 に答える 3

22

マシンコードは、特定のプロセッサアーキテクチャのCPU命令に対応する単なるバイナリデータです。

それがどこに保存されるかに依存するので、私はそれがどのように保存されるかについてはあまり説明しません。たとえば、ディスク上では、通常、一連の磁化領域として保存されます。マシンコードは、ストレージの面で他のバイナリデータと同じです。データがコンピューターにどのように保存されるかについて質問がある場合は、いくつか例を挙げると、HDD、RAM、レジスターなど、コンピューター内のさまざまなデータストレージデバイスを調査する必要があります。

マシンコードがどのように格納されているかを視覚化する最も簡単な方法は、16進エディタでいくつかを確認することです。これは、16進数で表されるバイナリデータを示しています。たとえば、次のように指示します。

0xEB 0xFE

これは、1110101111111110または60414と簡単に書くことができます。これは、バイナリを人間が読める形式に変換する方法によって異なります。

この命令は無限ループを表します。(これは、x86 CPUで実行されていることを前提としています。他のCPUは、必要に応じて解釈できます。)アセンブリで次のようにコーディングできます。

j:
jmp j

アセンブラを実行すると、上記のコードが取得され、上記のバイナリマシンコードに変換されます。

指示は実際には2つの部分です。1つ目は、オペコードと呼ばれるもので、0xEBです。このコードがCPUに入ると、次のことを意味します。プログラムから1バイトを読み取り、その数バイトのデータをスキップします。次に、CPUがバイトを読み取ります0xFE。符号付き整数を想定しているため、2進データを数値-2として解釈します。その後、命令の読み取りが完了し、命令ポインタが2バイト進みます。次に、命令が実行され、命令ポインタが-2(0xFE)バイト先に移動します。これにより、命令ポインタは、命令が開始されたときと同じ値に効果的に設定されます。

これがあなたの質問に答えることを願っています。CPUの内部動作について疑問がある場合は、マイクロコードと電子論理ゲートを読んでください。基本的には、1ビットが5ボルトの電荷であり、0ビットが0ビットの電荷であるなど、一連の電圧差です。

于 2012-04-25T23:05:43.627 に答える
6

私のように、あなたはコンピュータが内部でどのように機能するかについて興味を持っているようです。私はあなたの質問にうまく答えるのに十分なことを知りません(そしてそれはとにかく大きなトピックです)が、私はスティーブギブソンの「コンピュータを設計しよう」ポッドキャストシリーズを強くお勧めします。これは、「機械語」のトランスクリプトからの抜粋です。。。

そして、すべてのスキップ手段は、プログラムカウンターに1つ追加する代わりに、2つ追加するか、1つを2回追加することです。これは、実際にはこれらのマシンが当時どのように機能していたかです。そして、それは私たちがジャンプをスキップする原因になります。つまり、基本的には、メモリ内のどこにでも分岐したり、途中で続行したりできることを意味します。これにより、非常に単純ですが、マシンが決定を下すのに十分なパワーが得られます。そして、入出力があります。数学があります。メモリ内のある場所から別の場所にデータを転送する機能があります。これらはすべて、機械が機能する方法の本質です。それが機械語です。

さて、その上に置かれている人類の1つの層は、「アセンブリ言語」と呼ばれるものです。これは、物事に名前を付けることに他なりません。たとえば、さまざまな命令に対して一種のいわゆるニーモニックを作成します。したがって、たとえば、アキュムレータのロードはLDAになります。アキュムレータSTAを保存します。あなたはそれらをたくさんタイプするつもりなので、それらを短くしたいです。何かを成し遂げるために、たくさんの小さな指示を使うことになってしまうことを忘れないでください。そして、アセンブリ言語が実際に行う他の唯一のことは、メモリ内の場所に名前を付けることを可能にすることです。

したがって、たとえば、負荷アキュムレータの場合はLDA、現在のスコアと言うことができます。そして、現在のスコアは、基本的に変数のように、「現在のスコア」とラベル付けしたメモリ内の場所を単に参照します。そして、STAを実行した場合、アキュムレータ、新しいスコアを保存します。まず、現在のスコアをアキュムレータにロードし、次にそれを新しいスコアと呼ばれる別の場所に保存します。つまり、私たちが話しているのは、これらの個々の指示とメモリ内の場所の便利なラベルを覚えて使用するのに役立ついくつかの簡単な略語です。これにより、場所329627を覚える必要がなくなります。誰がそれをすることができますか?したがって、代わりに、その場所に英語、ある種の英数字のフレーズでラベルを付けます。

そして実際、あなたはその数が何であるかを気にしません。これは、アセンブラが行うことの1つです。つまり、これらのことと呼ばれるメモリが必要だと言うだけです。そして、彼らが一貫して参照されている限り、それはあなたにとって本当に重要ではないので、彼らがどこに行くのか心配します。そして、それがプロセス全体です。それが機械語とアセンブリ言語です。そして、それは50年前のやり方であり、多かれ少なかれそれが現在のやり方です。

。。しかし、彼はこれよりもさらにバックアップし、トランジスタと論理ゲートから始めます。私が言えることから、これが完全なシリーズです(そして聴衆はwikiで役立つ図を提供してくれました):

スティーブがこれらのエピソードで言ったことに誰かが問題を抱えている場合、フィードバックを提供するのに最適な場所はhttp://www.grc.com/feedback.htmまたはhttp://www.grc.com/discussions.htmまたはhttps:/です。 /twitter.com/SGgrc

于 2012-04-29T02:11:40.037 に答える
-2

初心者向け説明

ゼロから、コンピュータにはたくさんの「スイッチ」があります。たとえば、LEDライトをオフ
またはオンにすることができますが、オプションは2つだけです(1=オンまたは0=オフ)。LEDが2つある場合は、LED 1をオフにして
2をオンにしたり、その逆を行ったり、両方をオンまたはオフにすることができます。今ではより多くの可能性があります。

さまざまな可能性がいくつあるかを計算できます。
1ランプ=2^ 1 =2可能性
2ランプ=2^ 2 =4可能性
8ランプ=2^ 8 =256可能性

したがって、コンピュータは0と1のみを読み取ります。コンピュータには、CPU容量に応じて多くのスイッチがあります。コンピュータにランプをアクティブにするように指示するには、システムに0と1を追加する必要があり、それは非常に難しい作業になります。これを回避するために、彼らは可能性を16進数に変換しました。アセンブリは、入力した文字を0と1(バイナリコード)に変換し、指示に従う単なるコンピューター言語です。

于 2012-04-25T23:23:15.553 に答える