低レベルのものについてはまったく何も知らないので、これは非常に初心者の質問になります。私の無知を許してください。
機械語-一連の数値は、物理コンピューターに正確に何をすべきかを伝えます-常にバイナリですか?つまり常にゼロと1のみで構成されていますか?または、101、242、4などの数字で構成することもできますか?
コンピュータ内のすべて(正確には、現代の一般的なコンピュータでは)は、特定のレベルでバイナリです。 「1と0」は抽象化であり、2つの値を区別する方法を表すために使用します。 RAMでは、それはより高い電圧とより低い電圧を意味します。ハードドライブでは、それは明確な磁気状態などを意味します。ブール論理と基本2の数値システムを使用して、1と0の組み合わせで任意の数値を表すことができ、他のもの(文字、画像、音声など)を数値として表すことができます。
しかし、「バイナリコード」と言っても、それはそうではありません。これはプログラマにとって特別な意味があります。「バイナリ」コードは、テキスト形式ではないコードです。ソースコードはテキストとして存在します。それは英語と数学記号の高度に形式化されたシステムのように見えます。しかし、CPUは英語または数学表記を理解していません。それは数字を理解しています。そのため、コンパイラはソースコードを、ソースコードと同じ基本的な意味を持つCPU命令を表す数値のストリームに変換します。これは「マシンコード」として正しく知られていますが、多くの人が「バイナリ」と呼んでいます。
実際の機械語命令を見てみましょう。 ARM CPUがあり、レジスタ2の値に143を追加するとします。結果をレジスタ1に配置します。ARM記述されているアセンブリ言語
ADD R1, R2, #143
このアセンブリ命令は、単一の機械命令としてencodedにすることができます。それがどのように行われるかについての仕様は、 ARM ARM の物理ページ156にあります。これは、面白い名前のAcorn RISC Machine Architecture Reference Manualです。物理ページ444から始まる「シフターオペランド」の定義を確認することも必要です。
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
| Cond | 0 0 I 0 1 0 0 S| Rn | Rd | shifter operand |
すでに理解しているように、機械語命令はnumbersであり、ARMでは、固定サイズの数、32ビットで、いくつかのフィールドに分割されています。上記のADDをエンコードするには、次のようなフィールドに入力します。
| cond | fmt | I | opcode | S | Rn | Rd | rot | imm |
| E | 00 | 1 | 0100 | 0 | 2 | 1 | 0 | 143 |
(「シフターオペランド」は「rot」と「imm」に分かれています。私がI = 1に設定しているためです。)これを単一の32ビット数にするには、それをバイナリに展開する必要があります。フィールドは整然としたビット数ではありません:
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
1 1 1 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 1 1 1 1
人間にとっては大きなぼかしです。 16進数の方が理解しやすいです。
1110 0010 1000 0010 0001 0000 1000 1111 E 2 8 2 1 0 8 F
したがって、通常、他の人間と通信する場合、ADD R1, R2, #143
に対応する「機械命令」は16進数のE282 108F
であると言います。私たちはcouldはdecimalの数3,800,174,735であると等しく言いますが、16進数よりもフィールドのパターンが不明瞭になります。 (ARMのベアメタルで多くの練習デバッグを行う人は、E282 108F
から条件コードE、ソースおよび宛先レジスタ2および1、即値オペランド8F = 143を比較的簡単に選択できます。)
上記の表現はすべて同じ機械語命令をエンコードしています!私はそれを書き留める方法を変更しただけです。
「1と0」に関して、この命令を含むプログラムを実際のコンピュータのRAMにロードすると、メモリ内のどこかにビットパターン1110 0010 1000 0010 0001 0000 1000 1111が表示されます(おそらく後方、 エンディアンネス )のため。しかし、メモリ内のどこかに16進数E282 108F
またはデコードされた命令ADD R1, R2, #143
が現れると言うことは同等に有効です。 RAMのビットパターン自体には意味がありません。意味は文脈に由来します。逆に、そのビットパターン/ 16進数は、必ずしも命令であるとは限りません。また、符号なし32ビット整数3,800,174,735、または単精度IEEE浮動小数点数-1.199634951×10を利用したプログラムにも表示されます。21 dataとして。
ほとんどのコンテキスト、特にこのコンテキストで誰かが「1と0」というフレーズを使用するときはいつでも、それらは、私の意見では、何が起こっているのかをかなり誤って表しているため、混乱を招いています。
コンピュータは、本を読むときよりも「1と0」だけを読むのではなく、「文字」を読むだけです。もちろん、どちらも厳密に真実ですが、これらのステートメントは、それぞれの構造という重要な情報を除外しています。
英語の場合、文字は単語に構造化され、単語は一連の規則に従って文を構成します。単語の文字の順序と文の単語の順序は、意味を完全に変えることができます。
同様のプロセスがコンピューターや機械語にも関係しています。コンピュータは、1と0を離散チャンク、バイト、およびバイトのグループで調べます。
他のポスターでは、数値を個別のビットとしてエンコードできるさまざまな方法について言及しています。ビットとバイトのストリームに構造を与える整数、浮動小数点、テキスト文字列などがあります。
結局のところ、コンピュータはビットのグループを概念的に調べているため、「10101010」や101、242、4などを見ることはめったにありません。これらの数字の意味は、指定された「文」の内容によって異なりますの一部です。
ほとんどのコンピュータに保存されているすべての数値は、技術的にはバイナリ形式で保存されています。ハードウェアレベルでは、すべてが一連の高電圧信号と低電圧信号として表されます。高電圧信号は1 /真の値、低電圧信号は0 /偽の値です。これらは、32ビットまたは64ビットのマシンについて話すときに言及されるビット(2進数の略)です。この場合の数(32,64)は、一度にメモリからアドレス指定できるビット数を示します。
そのため、最近のほとんどのコンピューターでは、マシンコードはメモリに保存されている通常の値にすぎませんが、メモリはすべてビットで構成されています。
最近のほとんどすべての「コンピュータ」はバイナリロジックを使用しています。ただし、第二次世界大戦後の「コンピュータ」の意味は、単なる電卓のような単純なコンピューティングエンジンではなく、永続的なストレージと格納されたプログラムを備えたコンピューティングデバイスを意味するようになりました。
例外のいくつかの例は次のとおりです。
機械語は、普遍的な言語ではなく、厳密にCPU関連の言語であり、CPUが理解する言語です。
メモリの最小要素として、2状態ではなく 42 状態のCPUを設計できます。問題は、そのようなCPUを十分に実装できないことです。実際、最初のコンピュータ(ENIACを含む)の一部は 10進数のコンピュータ であり、暗黙的に10進数の機械語を使用していました。
10進数、2進数、またはその他の値であるという事実は、メモリの最小要素(ビット)が取り得る状態の数に依存します。 2はCPU設計の目的で選択されたのではなく、電子的な実装によって制限されました。トランジスタは、10(または2より大きい他の自然数)ではなく2レベルの電圧のみで、はるかに良好かつ高速に動作します。