Цель установить 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 - единственная нечетная степень двух, поэтому вы можете догадаться, что, удалив ее, мы получим только четные числа.

Другие вопросы по тегам