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

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

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

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

Picture 1

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

Picture 2

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

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

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

Picture 3

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

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

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

Picture 4

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

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

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

Picture 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-MSB (самый значительный байт), 5-LSB (наименее значительный байт). Самая важная деталь заключается в том, что вы должны shift байты, последний адресованный байт в (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) становится ясно и сейчас. Только один байт копируется, он становится LSB в месте назначения. Тот же рецепт для 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 of + 6 7 8 9 0 заменяет 2 3 4 of - 1 2 3 4 5.


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

STA 2000 (2:2). Вы ожидаете второй байт скопирован который равно 7 в регистре A. Однако каким-то образом мы заканчиваем - 1 0 3 4 5.

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

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

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

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

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

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