在 MMIX 机器mmix-doc第 3 页第 4 段的文档中:
我们使用该符号来表示由 从 location 开始的连续字节
组成的数字。(符号 表示将 k 的最低有效 t 位设置为 0,并且只保留结果地址的最低 64 位。...
符号 M 2 t [ k ] 只是表示可被 2 t整除的地址的形式符号。
这在定义之后得到确认
MMIX对 2 t字节数量的所有访问都是对齐的,即第一个字节是 2 t的倍数。
大多数架构,特别是 RISC 架构,都需要对齐内存访问,这意味着地址必须是访问大小的倍数。
因此,例如,从内存中读取 64 位字(MMIX 表示法中的八进制)需要地址可以被 8 整除,因为 MMIX 内存是字节可寻址(1)并且八进制中有 8 个字节。
如果所有可能的数据大小都是 2 的幂,我们会看到一个模式出现:
Multiples of Multiples of Multiples of
2 4 8
0000 0000 0000
0010 0100 1000
0100 1000
0110 1100
1000
1010
1100
1110
2 = 2 1的倍数始终将最低位设置为零(2),4 = 2 2的倍数将两个最低位设置为零,8 = 2 3的倍数将三个最低位设置为零,依此类推上。
通常,2 t的倍数将至少t位设置为零。您可以通过对t
的归纳来正式证明这一点。
对齐 64 位数字(MMIX 地址空间的大小)的一种方法是清除其低t位,这可以通过使用以下形式的掩码执行AND操作来完成
11111...1000...0
\ / \ /
64 - t t
这种掩码可以表示为 2 64 - 2 t。
2 64是一个很大的例子,假设地址空间只有 2 5。
假设我们有二进制地址 17h 或 10111b,假设我们想将它与八进制对齐。
Octas 是 8 个字节,2 3所以我们需要清除低 3 位并保留其他 2 位。
要使用的掩码是十六进制的 11000b 或 18h。这个数字是 2 5 -2 3 = 32 - 8 = 24 = 18h。
如果我们在 17h 和 18h 之间执行布尔与运算,我们会得到 10h,它是对齐的地址。
这解释了紧随其后使用的符号k ∧ (2 64 − 2 t ),“楔形”符号 ∧ 是逻辑与。
所以这个符号只是“描绘”了对齐地址k所需的步骤。
请注意,符号 k ∨ (2 t − 1) 也被引入,这是互补的,∨ 是 OR,整体效果是将低t位设置为 1。
这是对齐访问占用的最大地址大小为 2吨。
符号本身用于解释字节序。
如果您想知道为什么对齐访问很重要,它与硬件实现有关。
长话短说,尽管内存是可字节寻址的,例如 64 位,但 CPU 与内存的接口具有预定义的大小。
因此,CPU 以 64 位块的形式访问内存,每个块从 64 位的地址倍数开始(即对齐8 个字节)。访问未对齐的位置可能需要 CPU 执行两次访问:
CPU reading an octa at address 2, we need bytes at 2, 3, 4 and 5.
Address 0 1 2 3 4 5 6 7 8 9 A B ...
\ / \ /
A B
CPU read octa at 0 (access A) and octa at 4 (access B), then combines the two reads.
RISC 机器倾向于避免这种复杂性并完全禁止未对齐的访问。
(1)引用:“如果k是任何无符号八字节,则 M[ k ] 是 1 字节数量”。
(2) 2 0 = 1 是 2 的唯一奇次幂,所以你可以猜到,去掉它我们只能得到偶数。