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

标签 algorithm assembly knuth taocp mmix

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

We use the notation to stand for a number consisting of consecutive bytes starting at location . (The notation means that the least significant t bits of k are set to 0, and only the least 64 bits of the resulting address are retained. ...

最佳答案

符号 M2t[k] 只是一种形式符号,用于表示可被 2t 整除的地址.

这在定义后立即得到确认

All accesses to 2t-byte quantities by MMIX are aligned, in the sense that the first byte is a multiple of 2t.

大多数架构,特别是 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 = 21 的倍数的最低位始终设置为零(2),4 = 22 的倍数具有最低两位设置为零,8 的倍数 = 23 最低三位设置为零,依此类推。

一般来说,2t 的倍数中至少 t 位设置为零。
您可以通过归纳法来正式证明这一点。t

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

11111...1000...0
\      / \    /
 64 - t     t

这样的掩码可以表示为264 - 2t

264 是一个很大的数字,我们假设地址空间只有 25
假设我们有二进制地址 17h 或 10111b,并且希望将其与八进制对齐。
八进制是 8 个字节,23,因此我们需要清除低 3 位并保留其他 2 位。
要使用的掩码是十六进制的 11000b 或 18h。这个数字是 25-23 = 32 - 8 = 24 = 18 小时。
如果我们在 17h 和 18h 之间执行 bool AND,我们会得到 10h,这是对齐的地址。

这解释了之后不久使用的符号 k ∧ (264 − 2t),“楔形”符号∧是逻辑AND。
所以这个符号只是“描绘”对齐地址k所需的步骤。

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


如果您想知道为什么对齐访问很重要,它与硬件实现有关。
长话短说,尽管内存是可字节寻址的,例如 64 位,但 CPU 与内存的接口(interface)具有预定义的大小。
因此,CPU 以 64 位 block 的形式访问内存,每个 block 从 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) 20 = 1 是 2 的唯一奇数次幂,因此您可以猜测,通过删除它,我们只能得到偶数。

关于algorithm - 目的是通过内存操作将 MMIX 汇编中的最低有效位设置为 0?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37797454/

相关文章:

c# - 如何将长字符串拆分为固定的数组项

performance - 如何在单个程序中检查我的两个不同进程的运行时间

assembly - RISC-V NOP指令

literate-programming - 在 Windows 中读取 CWEB 格式的代码的最佳方式是什么?

java - 优化 Leaper Graph 算法?

algorithm - 如何在非凸多边形中排序顶点(如何找到众多解决方案之一)

assembly - 是否可以在程序集中进行自定义中断?

汇编 x86 寄存器有符号或无符号

algorithm - 数独算法 X 的时间复杂度是多少?

algorithm - 3SAT通过DNF简化解决?