2014-01-04 2 views
9

Я читал «Искусство программирования» Дональда Кнута Том 1. Теперь я закончил первую часть, где объяснялась вся математика, и это было очень приятно. К сожалению, на с. 121 он начинает объяснять этот вымышленный машинный язык под названием MIX на основе реальных машинных языков, в котором он впоследствии объяснит все алгоритмы, и г-н Кнут полностью потеряет меня.Как работают операции LDA, STA, SUB, ADD, MUL и DIV в машинном языке Knuth MIX?

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

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

Picture 1

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

Picture 2

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

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

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

Picture 3

LDA 2000 просто загружает полное слово, и мы видим его полностью в регистре A 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) должен быть скопирован только первый байт (знак). Это странно. Почему первое значение 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 или видит то, чего я не вижу, и готов поделиться своими знаниями и знаниями!

+0

Моя копия Кнута в настоящее время находится в транспортном контейнере на корабле, но [здесь] (http://en.wikipedia.org/wiki/MIX) с страницей wikipedia для MIX и [здесь] (http: //www.codeproject.com/Articles/152527/A-Simulator-for-Knuth-s-MIX-Computer), который вы можете проверить. –

+0

Спасибо, что прочитал эту страницу, но, к сожалению, она не дает объяснений по языковым операциям. Я нашел онлайн-симулятор MIX [здесь] (http://www.recolidaymath.com/mixal/). –

+1

Я преподавал структуры данных в 1969 году из тома 1 Кнута, никогда не понимая код сборки MIX; он предоставляет MIX-независимый код. ИМХО, это не повредило мне заметно, и я отлично справлялся со мной на протяжении более 40 лет (и я сделал много сборочного кодирования с использованием алгоритмов, которые он описал с тех пор). Надеюсь, вы получите хороший ответ, но вам не нужно ценить красоту и интуицию его доставки. –

ответ

4

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

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

Введите части слова от 0 до 5, слева направо. 0 - знаковый бит, 1 - MSB (старший байт), 5 - младший младший байт (младший байт). Самая важная деталь заключается в том, что у вас есть 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.

+1

Спасибо за ваш ответ! Ваше объяснение MSB и LSB делает его более ясным. Но я все еще не вижу этого в [image 4] (http://i.imgur.com/X3vpicX.jpg). Можете ли вы объяснить результаты «STA 2000 (2: 2)», «STA 2000 (2: 3)» и «STA 2000 (0: 1)» на этом изображении? –

+0

Он просто работает наоборот, сохраняя LSB до (: last). –

+1

У нас есть '- 1 2 3 4 5' в месте и регистр А имеет' + 6 7 8 9 0'. Затем, когда мы делаем «STA 2000 (2: 2)», младший байт (0) сохраняется во второй позиции. Хорошо! И в «STA 2000 (2: 3)» второй и третий байт (7 и 8) сохраняются в младшем значении байта и получается «- 1 9 0 1 4 5». Хорошая. И для 'STA 2000 (0: 1)' младший значащий байт A (0) сохраняется в первой позиции и получается '+ 0 2 3 4 5'. Ницца! Теперь я вижу, откуда она взялась! Я все еще не понимаю «SUB», «ADD», «MUL» и «DIV». Может быть, вы можете так любезно объяснить это? –

1

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

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

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

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

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

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

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

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

+0

Спасибо, я понимаю ваш ответ прямо сейчас! :) –

2

Вот еще один способ сделать операции магазина для компьютера MIX Knuth разумным. В операции хранения, например 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.

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

+0

Большое вам спасибо. Твой ответ - это, наконец, смысл для меня. – Reagankm