目的是在具有内存操作的MMIX程序集中设置为0个最低有效位?

时间:2016-06-13 19:13:20

标签: algorithm assembly knuth taocp mmix

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

  

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

1 个答案:

答案 0 :(得分:4)

符号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之间执行布尔AND,我们得到10h,这是对齐的地址。

这解释了 k ∧(2 64 - 2 t )之后使用的符号,“楔形“符号∧是逻辑AND 所以这个符号只是“画出”对齐地址 k 所必需的步骤。

注意,还引入了符号k∨(2 t - 1),这是互补的,∨是OR,整个效应是具有较低的 t 位设置为1 这是大小为2 t 的对齐访问占用的最大地址 符号本身用于解释 endianess

如果您想知道为什么对齐访问很重要,那么它与硬件实现有关 长话短说,内存的CPU接口具有预定义的大小,尽管存储器是字节可寻址的,比如64位 因此,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的唯一奇数幂,所以你可以通过删除它来猜测我们只得到偶数。