web-dev-qa-db-ja.com

KnuthのMMIXでは、xをオクタバイト(64ビット)、M [x]をバイト(8ビット)にするにはどうすればよいですか?

[〜#〜] mmix [〜#〜] のKnuthのFascicle 1では、4ページの「メモリとレジスタ」セクションに次のように記載されています。

"したがって、xが任意のオクタバイトの場合、M [x]はメモリのバイト。」

そして

"したがって、xが任意のバイトの場合、$xはオクタバイトです。 「」

xをオクタバイト(64ビット)およびM [xにする方法]バイト(8ビット)ですか?逆に、xをバイトにし、$xをオクタバイトにする方法?

2
user43713

MMIXは概念的な64ビットコンピュータであるため、そのアドレスバスには64回線があり、最大2 ^ 64のメモリセルを搭載できます。ただし、これらの各セルは64ビットではなく1バイト(8ビット)を保持するため、2 ^ 64バイト(オクトバイトではない)のRAMがあります。 (アーキテクチャに8ビットを超える場合でも、RAMバイトで測定し、ダブル、クワッド、またはオクトバイトでは測定しないのが通例です。メモリから個々のバイトを取得するのも便利です。多くのアルゴリズムは多くの場所で少数しか必要としないためです。実際には、プロセッサキャッシュはこの区別をあいまいにします。)

ただし、レジスタは完全な64ビットレジスタであるため、$ xは単なるバイトではなくオクトバイトです。繰り返しになりますが、これは固定法ではなくプロセッサアーキテクチャの規則ですが、Xビット(Xの値が非常に大きい)であると主張するほとんどのアーキテクチャもXビットレジスタを備えているため、Xをロードする場合はメモリからのビットを同時に、こぼさずに1つのレジスタでそれらを受け取ることができます。

4
Kilian Foth

「プレーンオール」メモリアドレスはアドレスバイトであるためです。ただし、複数のメモリアドレスを指定している場合は、複数のメモリアドレスが同じものを指していることに注意してください。

確かに、2 ^(64)バイトのメモリ、2 ^(63)ワイド、2 ^(62)テトラバイト、および2 ^(61)オクタバイトがあります。オクタバイトをアドレス指定する場合、基本的に3ビットが無視されることになります。

言い換えると、f(x)がアドレスxからそのメモリセルへの関数である場合(*x in C)、f(x)は全単射ではありません。さらに、f(x)は、オクタバイトをアドレス指定する場合の2項演算にすぎません。 (つまり、Xのxの場合f(f(x)もXにあります)。

intdoubleなどへのポインタのように考えることができます。

MMIXについて読んでいる人を見てうれしいです!

2
veryfoolish