Как работают операции LDA, STA, SUB, ADD, MUL и DIV на машинном языке Кнута MIX?

Я читал книгу "Искусство компьютерного программирования" Дональда Кнута, том 1. Теперь я закончил первую часть, где объяснялась вся математика, и это было очень приятно. К сожалению, на с. 121 он начинает объяснять этот вымышленный машинный язык под названием MIX основанный на реальных машинных языках, на которых он впоследствии объяснит все алгоритмы, и мистер Кнут полностью теряет меня.

Я надеюсь, что здесь есть кто-то, кто немного говорит MIX и может помочь мне понять это. В частности, он потерял меня, когда начал объяснять различные операции и показывать примеры (стр. 125 и далее).

Кнут использует этот "формат инструкции" в следующей форме:

Фото 1

Он также объясняет, что означают разные байты:

Фото 2

Таким образом, правильный байт - это операция, которую нужно выполнить (например, LDA "загрузить регистр A"). F byte - это модификация кода операции со спецификацией поля (L:R) с 8L + R (например, C=8 и F=11 дает "загрузить регистр A с полем (1:3)). Тогда +/- AA - это адрес, а я - индексная спецификация для изменения адреса.

Ну, это имеет какой-то смысл для меня. Но тогда Кнут приходит с некоторыми примерами. Первое, что я понимаю, за исключением нескольких битов, но я не могу обернуть голову вокруг последних трех во втором примере и вообще ничего из более сложных операций в примере 3 ниже.

Вот первый пример:

Фото 3

LDA 2000 просто загружает полное слово, и мы видим его полностью в регистре А rA, Второй LDA 2000(1:5) загружает все от второго бита (индекс 1) до конца (индекс 5), и поэтому загружается все, кроме знака плюс. И третий с LDA 2000(3:5) просто загружает все с третьего байта до последнего. Также LDA 2000(0:3) (четвертый пример) вид имеет смысл. -803 должен быть скопирован и - взят, а 80 и 3 помещены в конце.

Пока все хорошо, в номере 5, если мы будем следовать той же логике, LDA2000(4:4) это только передача четвертого байта. Что он действительно сделал до последней позиции. Но потом, в LDA 2000(1:1) только первый байт (знак) должен быть скопирован. Это странно Почему первое значение а + вместо - (я ожидал, что будет скопировано только -). и почему другие значения все 0 и последний знак вопроса?

Затем он приводит второй пример с операцией STA (магазин А):

Фото 4

Снова, STA 2000, STA 2000(1:5) а также STA 2000(5:5) имеет смысл с той же логикой. Тем не менее, тогда Кнут делает STA 2000(2:2), Можно ожидать, что будет скопирован второй байт, равный 7 в регистре А. Однако каким-то образом мы каким-то образом получим - 1 0 3 4 5, Я смотрел на них в течение нескольких часов и понятия не имею, как это, или два примера, которые следуют за этим (STA 2000(2:3) а также STA 2000(0:1)) может привести к отображению содержимого местоположения.

Я надеюсь, что кто-то здесь может пролить свой свет на эти последние три.

Кроме того, у меня также большие проблемы со страницей, где он объясняет операции ADD, SUB, MUL, а также DIV, Третий пример смотрите

Фото 5

Этот третий пример - моя конечная цель, чтобы понять, и сейчас он имеет абсолютно нулевой смысл. Это очень расстраивает, так как я хочу продолжить с его алгоритмами, но если я не понимаю MIX Я не смогу понять остальное!

Я надеюсь, что кто-то здесь прошел курс MIX или видит то, чего я не вижу, и готов поделиться своими знаниями и идеями!

3 ответа

Решение

Дизайн - это дитя 1960-х годов, когда в байтах было 6 битов, а десятичные вычисления были обычным явлением. Машины должны были конкурировать с 10-значными калькуляторами. Следует подчеркнуть, что это вымышленная архитектура, фактически реализовать ее будет сложно, поскольку байт не имеет фиксированного размера. MIX может работать в двоичном формате, где байт хранит 6 битов, вы получите эквивалент 31-битной машины: 1 бит для знака и 5 x 6 бит для байтов составляют слово. Или может работать в десятичном формате, где один байт хранит две цифры (0...99). Это не вписывается в 6 бит (0..63), подчеркивая вымышленную часть дизайна.

В то же время он обладает другой общей характеристикой машин: память имеет только адресную адресацию. Или, другими словами, вы не можете адресовать ни одного байта, как на всех современных процессорах. Таким образом, нужен трюк, чтобы поднять значения байтов из слова, вот что (first:last) модификатор делает.

Пронумеруйте части слова от 0 до 5 слева направо. 0 - это знаковый бит, 1 - это старший бит (старший байт), 5 - младший (младший байт). Самая важная деталь заключается в том, что вам нужно сдвинуть байты, последний адресуемый байт в (first:last) становится LSB в пункте назначения.

Так что простые для понимания LDA 2000(0:5), копирует все, LDA 2000(1:5) копирует все, кроме знакового бита, LDA 2000(3:5) копирует 3 байта без какого-либо смещения, так как LSB копируется. Пока last 5, то ничего особенного не происходит.

LDA 2000(0:0) это также легко понять, он только копирует бит знака, ни один из байтов.

LDA 2000(0:3) это где начинается проблема. Картинка может помочь:

+---+---+---+---+---+---+
| 0 | 1 | 2 | 3 | 4 | 5 |
+---+---+---+---+---+---+
  |
  v
+---+---+---+---+---+---+
| 0 | x | x | 1 | 2 | 3 |
+---+---+---+---+---+---+

(0: 3) перемещает знаковый бит и байты с № 1 по № 3. Обратите внимание, что байт № 3 становится наименее значимым байтом в целевом слове. Именно этот сдвиг, вероятно, вызывает путаницу.

возможно LDA 2000(4:4) становится ясно и сейчас. Копируется только один байт, он становится младшим битом в месте назначения. Тот же рецепт для LDA 2000(1:1), теперь перемещение байта № 1 к байту № 5.

Вот еще один способ сделать операции хранилища для компьютера Кнута MIX целесообразными. В магазине операция, как STA 2000(a:b) спецификация поля (a:b) ссылается не на байты в регистре, а на байты в ячейке памяти. Он говорит, что хранить данные в rA в ячейке памяти 2000, начиная с a в 2000 году и заканчивается в b в 2000 году. Затем он принимает только необходимые байты в rA, начиная справа и хранит их в 2000 году.

Так что, если у нас есть память 2000, как это:

- 1 2 3 4 5

а также rA выглядит так:

+ 6 7 8 9 0

а затем мы выполняем STA 2000(2:2) результат

- 1 0 3 4 5

потому что байт в 2 и заканчивается в 2 заменяется в памяти со значениями в rA начиная слева: 0. STA 2000(3:3) тогда оставил бы область памяти 2000 как: - 1 2 0 4 5, а также STA 2000(4:4) даст нам - 1 2 3 0 5,

Так же, STA 2000(2:4) дает нам - 1 8 9 0 5, заменяя байты (2:4) в 2000 году с 3 байтами из rAначиная с правой стороны rA и считать влево, так 8 9 0 из + 6 7 8 9 0 заменяет 2 3 4 из - 1 2 3 4 5,

Это был не самый ясный момент для Кнута, но если вы внимательно прочитали его объяснение на странице, которую вы показали, это действительно прояснит это.

О загрузках и хранилищах: кажется, что знак идет к знаку, если он включен, тогда как остальные байты в спецификации поля идут в / из младших байтов регистра. Поле скорости описывает поле в памяти, а не в регистре.

СТА 2000(2:2). Можно ожидать, что будет скопирован второй байт, равный 7 в регистре А. Однако каким-то образом мы каким-то образом получим - 1 0 3 4 5.

Здесь байты памяти от 2 до 2 (длина составляет 1 байт) записываются младшим байтом (длиной) регистра.

Обратите внимание, что знак не является обычным "байтом", поэтому при загрузке поле 0 переходит к знаку, а не к младшему байту, как остальные байты. Возможно, было бы неплохо думать о поле 0 как о знаке, не думая о его местоположении.

STA 2000 (0: 1) сохраняет данные в полях памяти 0 и 1: это знаковый бит (поле памяти 0) и младший байт из регистра в поле памяти 1.

Когда дело доходит до арифметики, обратите внимание, что архитектура ориентирована не на байт, а на цифру. Первый пример (добавить) выглядит так, как будто он использует десятичный режим, или объяснение использует десятичную запись. Не уверен, какой.

Из википедии (ссылка "500 - Внутренняя ошибка сервера"):

MIX - это гибридный двоично-десятичный компьютер. При программировании в двоичном формате каждый байт имеет 6 битов (диапазон значений от 0 до 63). В десятичном формате каждый байт имеет 2 десятичных знака (значения в диапазоне от 0 до 99). Байты сгруппированы в слова из пяти байтов плюс знак. Большинство программ, написанных для MIX, будут работать как в двоичном, так и в десятичном виде, если они не пытаются сохранить значение больше 63 в одном байте.

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