目的是在内存操作的 MMIX 程序集中将最低有效位设置为 0?
Purpose to set to 0 least significant bits in MMIX assembly with memory operations?
在 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 地址的大小 space)的一种方法是清除其较低的 t 位,这可以通过执行AND 操作,掩码形式为
11111...1000...0
\ / \ /
64 - t t
这样的mask可以表示为264 - 2t。
例如,264 是一个很大的数字,假设地址 space 只有 25.
假设我们有二进制地址 17h 或 10111b,假设我们想将其与八进制对齐。
Octas 是 8 个字节,23 所以我们需要清除低 3 位并保留其他 2 位。
要使用的掩码是 11000b 或十六进制的 18h。这个数字是 25-23 = 32 - 8 = 24 = 18h.
如果我们在 17h 和 18h 之间执行布尔与,我们得到 10h,这是对齐的地址。
这解释了符号 k ∧ (264 − 2t) 紧跟其后,"wedge"符号∧是逻辑与。
所以这个符号只是 "pictures" 对齐地址所需的步骤 k.
注意记号 k ∨ (2t − 1) 也被引入,这是互补,∨ 是或,整个效果是有较低的 t 位设置为 1.
这是大小为 2t.
的对齐访问占用的最大地址
符号本身用于解释 endianess.
如果您想知道为什么对齐访问很重要,这与硬件实现有关。
长话短说,CPU 内存接口具有预定义的大小,尽管内存是字节可寻址的,比如 64 位。
因此 CPU 以 64 位块的形式访问内存,每个块都从 64 位的地址倍数开始(即 aligned 在 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 的唯一奇次方,所以你可以猜到通过删除它我们只得到偶数。
在 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 地址的大小 space)的一种方法是清除其较低的 t 位,这可以通过执行AND 操作,掩码形式为
11111...1000...0
\ / \ /
64 - t t
这样的mask可以表示为264 - 2t。
例如,264 是一个很大的数字,假设地址 space 只有 25.
假设我们有二进制地址 17h 或 10111b,假设我们想将其与八进制对齐。
Octas 是 8 个字节,23 所以我们需要清除低 3 位并保留其他 2 位。
要使用的掩码是 11000b 或十六进制的 18h。这个数字是 25-23 = 32 - 8 = 24 = 18h.
如果我们在 17h 和 18h 之间执行布尔与,我们得到 10h,这是对齐的地址。
这解释了符号 k ∧ (264 − 2t) 紧跟其后,"wedge"符号∧是逻辑与。
所以这个符号只是 "pictures" 对齐地址所需的步骤 k.
注意记号 k ∨ (2t − 1) 也被引入,这是互补,∨ 是或,整个效果是有较低的 t 位设置为 1.
这是大小为 2t.
的对齐访问占用的最大地址
符号本身用于解释 endianess.
如果您想知道为什么对齐访问很重要,这与硬件实现有关。
长话短说,CPU 内存接口具有预定义的大小,尽管内存是字节可寻址的,比如 64 位。
因此 CPU 以 64 位块的形式访问内存,每个块都从 64 位的地址倍数开始(即 aligned 在 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 的唯一奇次方,所以你可以猜到通过删除它我们只得到偶数。