目的是通过内存操作将 MMIX 汇编中的最低有效位设置为 0?

Ale*_*yak 2 algorithm assembly taocp knuth mmix

在 MMIX 机器mmix-doc第 3 页第 4 段的文档中:

我们使用记号代表由以下组成的数字 从位置开始的连续字节。(符号 表示将 k 的最低有效 t 位设置为 0,并且仅保留结果地址的最低 64 位。...

Mar*_*oom 5

符号 M 2 t [ k ] 只是表示可被 2 t整除的地址的形式符号。

\n\n

这在定义之后就得到了确认

\n\n
\n

MMIX对 2 t字节数量的所有访问都是对齐的,因为第一个字节是 2 t的倍数。

\n
\n\n

大多数架构,特别是 RISC 架构,需要对齐内存访问,这意味着地址必须是访问大小的倍数。
\n因此,例如,从内存中读取 64 位字(MMIX 表示法中的八进制)需要地址能被 8 整除,因为 MMIX 内存是可字节寻址的(1)并且八进制中有 8 个字节。

\n\n

如果所有可能的数据大小都是 2 的幂,我们会看到一种模式出现:

\n\n
Multiples of     Multiples of     Multiples of\n   2                 4                 8\n\n 0000               0000              0000\n 0010               0100              1000\n 0100               1000\n 0110               1100\n 1000\n 1010\n 1100\n 1110\n
Run Code Online (Sandbox Code Playgroud)\n\n

2 = 2 1的倍数的最低位始终设置为零(2),4 = 2 2的倍数将最低两位设置为零,8 = 2 3的倍数将最低三位设置为零,所以在。

\n\n

一般而言,2 t的倍数将最少t位设置为零。
\n您可以通过对t进行归纳来正式证明这一点。

\n\n

对齐 64 位数字(MMIX 地址空间的大小)的一种方法是清除其低t位,这可以通过使用以下形式的掩码执行AND运算来完成

\n\n
11111...1000...0\n\\      / \\    /\n 64 - t     t\n
Run Code Online (Sandbox Code Playgroud)\n\n

这样的掩模可以表示为2 64 - 2 t

\n\n

例如2 64是一个很大的数字,让我们假设地址空间只有 2 5
\n假设我们有二进制地址 17h 或 10111b,并且假设我们想要将其与八进制对齐。
\n八进制是 8 个字节,2 3,所以我们需要清除低 3 位并保留其他 2 位。
\n要使用的掩码是十六进制的 11000b 或 18h。这个数字是 2 5 -2 3 = 32 - 8 = 24 = 18h。
\n如果我们在 17h 和 18h 之间执行布尔 AND,我们会得到 10h,这是对齐的地址。

\n\n

这解释了不久后使用的符号k \xe2\x88\xa7 (2 64 \xe2\x88\x92 2 t ),“楔形”符号 \xe2\x88\xa7 是逻辑 AND。\n所以这个符号只是“描绘”对齐地址k
所需的步骤。

\n\n

请注意,还引入了符号 k \xe2\x88\xa8 (2 t \xe2\x88\x92 1),这是互补的,\xe2\x88\xa8 是 OR,整个效果是具有较低的t位设置为 1。 \n这是大小为 2 t
的对齐访问占用的最大地址。\n符号本身用于解释字节序

\n\n
\n\n

如果您想知道为什么对齐访问很重要,那么它与硬件实现有关。
\n长话短说,尽管内存是可字节寻址的(例如 64 位),但 CPU 与内存的接口具有预定义的大小。
\n因此,CPU 以 64 位块的形式访问内存,每个块从 64 位的倍数地址开始(即按 8 字节对齐)。\n访问未对齐的位置可能需要 CPU 执行两次访问:

\n\n
CPU reading an octa at address 2, we need bytes at 2, 3, 4 and 5.\n\nAddress    0 1 2 3 4 5 6 7 8 9 A B ...\n           \\     / \\     /\n              A       B\n\nCPU read octa at 0 (access A) and octa at 4 (access B), then combines the two reads.\n
Run Code Online (Sandbox Code Playgroud)\n\n

RISC 机器倾向于避免这种复杂性并完全禁止未对齐的访问。

\n\n
\n\n

(1)引用:“如果k是任何无符号八字节,则 M[ k ] 是 1 字节\n数量”。

\n\n

(2) 2 0 = 1 是 2 的唯一奇次方,因此您可以猜测,通过删除它,我们只能得到偶数。

\n