Цель установить 0 наименее значимых битов в сборке MMIX с операциями с памятью?
В документации к станку MMIX mmix-doc стр. 3 п. 4:
Мы используем обозначения стоять за число, состоящее из последовательные байты, начиная с места , (Обозначение означает, что младшие значащие t битов k установлены в 0, и сохраняются только младшие 64 бита результирующего адреса....
1 ответ
Обозначение M 2 t [ k ] - это просто формальная символика для выражения адреса, делимого на 2 t.
Это подтверждается сразу после определения
Все обращения к 2-байтовым величинам по MMIX выровнены в том смысле, что первый байт кратен 2 т.
Большинство архитектур, особенно RISC, требуют выравнивания доступа к памяти, это означает, что адрес должен быть кратным размеру доступа.
Так, например, для чтения 64-битного слова (окта в нотации MMIX) из памяти требуется, чтобы адрес делился на 8, потому что память MMIX является адресуемой по байтам (1), а в октане 8 байтов.
Если все возможные размеры данных являются степенью двойки, мы видим, что шаблон появляется:
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 т.
2 64 большое число для примера, давайте представим, что адресное пространство составляет всего 2 5.
Допустим, у нас есть адрес 17h или 10111b в двоичном формате, и давайте предположим, что мы хотим выровнять его по октам.
Octas - это 8 байтов, 2 3, поэтому нам нужно очистить младшие 3 бита и сохранить остальные 2 бита.
Маска для использования - 11000b или 18h в шестнадцатеричном формате. Это число 2 5 -2 3 = 32 - 8 = 24 = 18 часов.
Если мы выполняем логическое И между 17h и 18h, мы получаем 10h, который является выровненным адресом.
Это объясняет обозначение k ∧ (2 64 - 2 t), используемое вскоре после того, как символ "клин" ∧ является логическим AND.
Так что это обозначение просто "изображает" шаги, необходимые для выравнивания адреса k.
Обратите внимание, что также введено обозначение k ∨ (2 t - 1), оно является дополнительным, OR является OR, и весь эффект состоит в том, что младшие t битов установлены в 1.
Это самый большой адрес, занятый выравниваемым доступом размером 2 т.
Само обозначение используется для объяснения порядка байтов.
Если вам интересно, почему согласованный доступ важен, это связано с аппаратной реализацией.
Короче говоря, интерфейс ЦП к памяти имеет предопределенный размер, несмотря на то, что память адресуется в байтах, скажем, 64 бита.
Таким образом, процессор обращается к памяти в блоках по 64 бита, каждый из которых начинается с адреса, кратного 64 битам (т.е. выровнен по 8 байтов). Для доступа к невыровненному местоположению ЦП может потребоваться два доступа:
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 - единственная нечетная степень двух, поэтому вы можете догадаться, что, удалив ее, мы получим только четные числа.