基本的に、最新のコンピューターはすべてビットプッシュマシンです。通常、バイト、ワード、dword、またはqwordと呼ばれるデータのクラスターでビットをプッシュします。
バイトは、8ビット、ワード2バイト(または16ビット)、dword 2ワード(または32ビット)、qword 2 dword(または64ビット)で構成されます。これらはビットを配置する唯一の方法ではありません。多くの場合、SIMD命令で128ビットと256ビットの操作も行われます。
アセンブリ命令はレジスタで動作し、メモリアドレスは通常上記の形式のいずれかで動作します。
ALU(算術論理ユニット)は、整数を表すかのようにビットのバンドル(通常は2の補数形式)で動作し、FPUは浮動小数点値(通常はIEEE 754スタイルfloat
およびdouble
)を表すように動作します。その他の部分は、何らかの形式、文字、テーブルエントリ、CPU命令、またはアドレスのバンドルデータであるかのように機能します。
典型的な64ビットコンピューターでは、8バイト(64ビット)のバンドルがアドレスです。これらのアドレスは従来どおり16進形式(など0xabcd1234cdef5678
)で表示されますが、これは人間がビットパターンを簡単に読み取れる方法です。各バイト(8ビット)は2つの16進文字として書き込まれます(各16進文字-0からF-は4ビットを表します)。
実際に行われているのは(実際にはある程度)、ビットがあり、通常はレジスタに格納されているか、メモリバンク内の隣接する場所に格納されており、別の人間に説明しようとしているだけです。
ポインターをたどると、メモリコントローラーにその場所のデータを提供するように要求されます。通常、メモリコントローラーに特定の場所で特定のバイト数を要求します(通常、暗黙的に一連の場所であり、通常は連続しています)。
コードは通常、フェッチするデータの宛先(レジスタ、別のメモリアドレスなど)を指定します。通常、整数を期待するレジスタに浮動小数点データをロードするか、その逆を行うのは悪い考えです。
C / C ++のデータのタイプは、コンパイラが追跡するものであり、生成されるコードを変更します。通常、実際にそれを作成するデータには本質的なものはありませんに任意の1つのタイプ。コードによって整数のような方法(またはフロートのような方法、またはアドレスのような方法)で操作されるビットの集合(バイトに配置)。
これには例外があります。特定のものが異なる種類のビットであるアーキテクチャがあります。最も一般的な例は、保護された実行ページです-CPUに行うことを指示する命令はビットですが、実行時に実行するコードを含む(メモリ)ページは特別にマークされ、変更できず、マークされていないページを実行できません実行ページとして。
また、読み取り専用データ(ROMに格納されて物理的に書き込みできない場合もあります!)、アライメントの問題(一部のプロセッサーはロードできません)もあります double
特定の方法でアライメントされない限り、メモリからsを、または特定のアライメントを必要とするSIMD命令)、および無数の他のアーキテクチャの癖。
上記のレベルの詳細でさえ嘘です。コンピューターは「本当に」ビットを押しのけているのではなく、電圧と電流を押しのけています。これらの電圧と電流は、ビットの抽象化レベルで「想定」されていることを実行しないことがあります。チップは、そのようなエラーのほとんどを検出し、より高いレベルの抽象化に気付かずに修正するように設計されています。
それも嘘です。
抽象化の各レベルは以下を隠し、Feynmanダイアグラムを印刷するために気にする必要なしに問題を解決することについて考えることを可能にします "Hello World"
。
したがって、十分なレベルの正直さで、コンピューターはビットをプッシュし、それらのビットは、それらがどのように使用されるかによって意味を与えられます。