Данному образовательному сайту пришлось несколько раз менять свое имя. С 2022 года доступ к нему обеспечивается по URL
emc.orgfree.com

emc.km.ru (2001-2007) ==> educomp.org.ru (2007-2011) ==> educomp.runnet.ru (2011-2021) ==> emc.orgfree.com (2022-...)
Более подробно об истории сайта можно прочитать здесь.


Учебные модели компьютера



Модели (software):

"Е14" (parallel !!!)
"S9PU" (parallel)

Модели (hardware):






Награды сайта
Награды сайта 2005

Наиболее важные команды MMIX

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

Под код операции в модели MMIX отводится один байт. Из этого немедленно следует, что количество операций в ее системе команд не может превышать 256. Кнут использовал все 256 возможностей, причем, как он заявил в одном из интервью [5], это не случайно: он принципиально считает, что не один из кодов не должен оставаться незадействованным.

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

Команды переписи информации

Начнем с наиболее простых команд – команд переписи информации. Эти инструкции не производят никакой обработки информации, а только переписывают информацию из одного места в другое. В качестве источника и приемника информации могут выступать как регистры, так и ячейки памяти компьютера. В MMIX команды пересылки спроектированы следующим образом.

Прежде всего, выделены операции считывания данных из памяти и их записи в память. Рассмотрим для примера запись в память. Полное содержимое конкретного регистра $X или его части (8, 16, 32 или 64 бита) можно записать, используя одну из операций, код которой находится в диапазоне A0AF. Конкретный код зависит от того, сколько байт требуется записать в память, а также нужно ли при этом учитывать знак числа или нет. Кроме того, как уже упоминалось при обсуждении форматов команд, адрес ячейки памяти может вычисляться одним из двух возможных способов: регистр + регистр или регистр + константа. В итоге получаем 16 инструкций записи информации в ОЗУ:

код мнемоника действие
A0STB $X, $Y, $Z записать 1 байт со знаком из $X в $Y + $Z
A1STBI $X, $Y, Z записать 1 байт со знаком из $X в $Y + Z
A2STBU $X, $Y, $Z записать 1 байт без знака из $X в $Y + $Z
A3STBUI $X, $Y, Z записать 1 байт без знака из $X в $Y + Z
A4STW $X, $Y, $Z записать 2 байта со знаком из $X в $Y + $Z
  
A8STT $X, $Y, $Z записать 4 байта со знаком из $X в $Y + $Z
  
ACSTO $X, $Y, $Z записать 8 байтов со знаком из $X в $Y + $Z
...  

Примечание. В таблице специально пропущены некоторые строчки. Они легко поддаются восстановлению чисто логическим путем. Советую читателям проделать это в качестве несложного упражнения.

Отметим, что запись в память чисел со знаком и без знака осуществляется немного по-разному, но отличия пока рассматривать не будем.

Совершенно аналогично строится таблица для операций чтения данных из памяти.

Наконец, обсуждая команды переписи информации, нельзя не упомянуть столь необходимые на практике инструкции для задания значений регистров. Они содержат двухбайтовую константу (см. формат 3), которая и заносится в заданную кодом операции “четверть” регистра. Например, команда SETH (код E0) определяет старшие 2 байта, а SETL (код E3) –  младшие. При этом все остальные байты обнуляются. Инструкции E4 – E7 делают то же самое, что E0 – E3, но значения неопределяемых байтов сохраняются без изменений. Наличие таких инструкций позволяет задавать содержимое регистра “по частям”, используя несколько последовательных команд.

Чтобы закрепить все эти многочисленные возможности, предлагаем читателю внимательно разобрать приведенную ниже последовательность команд

код мнемоника действие комментарий
E0 01 1234SETH $1, 1234 $1 <== 1234 0…0константа
E5 01 5678INCMH $1, 5678 $1 <== 1234 5678 0…0(дополнить ее)
E3 02 0100SETL $2, 0100 $2 <== 0…0 0100адрес
E5 02 2000INCMH $2, 2000 $2 <== 2000 0000 0100(дополнить его)
AD 01 02 00STOI $1, $2, 0 ($2+0) <== $1записать в ОЗУ

и убедиться, что они заносят 8-байтовую константу 1234 5678 0000 0000 в память начиная с адреса 0000 2000 0000 0100.

Арифметические операции

Другую не менее важную группу команд образуют арифметические операции (вспомним, что своим названием ЭВМ были обязаны именно вычислительным действиям).

Арифметические инструкции в MMIX реализуются достаточно просто и единообразно. В соответствии с форматом 1 или 2, выполняется необходимое вычислительное действие над двумя регистрами или регистром и константой, а результат всегда помещается в регистр, указанный в команде первым. Например, инструкция вычитания двух чисел с учетом знака 24 01 02 03 (ее мнемоника SUB) выполняется так: из содержимого регистра $2 вычитается значение, находящееся в $3 и результат записывается в $1.

Примеры некоторых арифметических операций приведены в следующей таблице.

код мнемоника действие
20ADD $X, $Y, $Z $X <== $Y + $Z (целые числа со знаком)
24SUB $X, $Y, $Z $X <== $Y – $Z (целые числа со знаком)
18MUL $X, $Y, $Z $X <== $Y * $Z (целые числа со знаком)
DIV $X, $Y, $Z $X <== $Y / $Z (целые числа со знаком)
04FADD $X, $Y, $Z X <== $Y + $Z (вещественные числа)
06FSUB $X, $Y, $Z $X <== $Y – $Z (вещественные числа)
10FMUL $X, $Y, $Z $X <== $Y * $Z (вещественные числа)
14FDIV $X, $Y, $Z $X <== $Y / $Z (вещественные числа)

Следует иметь в виду, что в таблице приведены далеко не все арифметические операции MMIX, но для решения простейших задач содержимого таблицы вполне достаточно.

Особо в этой группе хочется выделить команды сравнения данных. При сравнении из $Y вычитается $Z и знак результата записывается в $X: так, при $Y < $Z в $X записывается –1; при $Y > $Z результат равен +1, а при $Y = $Z – нулю.

В качестве образца решения на MMIX вычислительной задачи см. пример 1 в следующем разделе.

Логические операции

Обычно процессоры “обучены” выполнять 3 базовых логических операции (И, ИЛИ, НЕ). Нередко этот набор дополняет исключающее ИЛИ. MMIX в этом смысле выглядит гораздо мощнее: он умеет выполнять 16(!) логических операций, включая, разумеется, все базовые.

Очень оригинально реализована в MMIX операция логического отрицания НЕ. Обычно данная инструкция отличается от остальных, поскольку у нее не два, а только один операнд. Кнут предлагает реализовать НЕ как частный случай другой более сложной комплексной операции. Например, можно взять за основу инструкцию c кодом C5, которая вычисляет NOT ($Y OR Z), положив Z=0. Нетрудно видеть, что при этом фактически получается требуемая нам операция NOT $Y.

Особо хотелось бы подчеркнуть, что логические инструкции всегда являются поразрядными, т.е. выполняются над каждым разрядом (битом) в отдельности независимо от результатов обработки всех остальных битов. Поэтому часто обсуждаемые операции используются для выделения отдельных битов кода (вы, конечно, помните, что отдельно взятый бит нельзя извлечь из ОЗУ!), а также для сброса или установки отдельных битов информации. Вот типичный пример: логическая инструкция И с кодом C9 01 01 20 сбрасывает 5-й бит в коде символа и тем самым преобразует любую букву в заглавную. Команда ИЛИ, имеющая код C1 01 01 20, напротив, устанавливает этот бит в 1, что соответствует строчным буквам.

Операции управления

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

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

Переходы могут быть безусловные и условные. В первом случае переход выполняется всегда и вне зависимости от результатов предыдущих действий. Во втором случае поведение процессора будет более сложным. Если результат предыдущей операции удовлетворяет определенному условию, то переход “срабатывает”, а в противном случае он игнорируется и обычным порядком выполняется следующая за условным переходом инструкция. Читатели, знакомые хотя бы с одним языком программирования, без сомнения, узнали в описанном алгоритме логику условной конструкции IF – THEN. Разумеется, это не случайно, ибо первые языки программирования строились по аналогии с внутренним языком процессора, а значит, не могли не быть на него похожи.

В MMIX существует достаточно большой ассортимент условных переходов. Некоторые из них приведены в таблице:

код мнемоника условие действие
40BN $X, S< 0 переход “вперед” при < 0 (if Negative)
41BNB $X, S< 0 переход “назад” при < 0 (if Negative)
42BZ $X, S= 0 переход “вперед” при = 0 (if Zero)
44BP $X, S> 0 переход “вперед” при > 0 (if Positive)
48BNN $X, S>= 0 переход “вперед” при >= 0 (if NonNegative)

Всего в MMIX 16 переходов такого типа; из них ровно половина является переходами “вперед по программе” (выражаясь более точно, в сторону увеличения адресов), а остальные “назад”. Коды переходов “назад” всегда на единицу больше.

В каждой команде указывается регистр, содержимое которого MMIX проверяет в соответствии с кодом операции на справедливость определенного условия. Как нетрудно сообразить, таких условий ровно 8: из них 6 – общепринятые проверки на неравенство (<0, =0, >0, >=0, <>0, <=0), а оставшиеся контролируют четность и нечетность.

Последним параметром команды перехода является смещение S, которое показывает, сколько команд считая от команды перехода надо пропустить; при переходе “назад” S<0.

Конкретные примеры команд перехода можно посмотреть в задачах 2, 3 следующего раздела.

Помимо описанных выше 16 условных переходов Кнут вводит еще 16 функционально аналогичных переходов (коды 50-5F), но с другим временем исполнения, а также 32 условных переписи (коды 60-7F). Подробности этих операций рассматривать не будем.

Команда безусловного перехода (F0 “вперед” и F1 “назад”) имеет особый формат (см. формат 4), что позволяет задавать смещение не в двух байтах, а в трех. Все остальные правила полностью аналогичны рассмотренным ранее для смещения условных переходов.

Завершая обсуждение группы управляющих инструкций, поговорим подробнее о проблеме окончания программы. Раньше (в машинах первого и второго поколения) вопроса о том, что делать после окончания решения задачи просто не стояло – ЭВМ пассивно ожидала, пока оператор введет следующую задачу. Поэтому каждая программа кончалась специальной командой, завершающей работу (на программистском жаргоне ее почему-то называли “останов”). В ответ на данную инструкцию ЭВМ прекращала всякую деятельность и из состояния ожидания ее выводил оператор, нажимая те или иные кнопки на пульте управления машины. В третьем поколении ЭВМ, когда машины стали коллективными и многозадачными, такое поведение стало неразумным. Появилась операционная система, автоматически управляющая прохождением задач; поэтому, завершая свою работу, каждая программа стала “возвращать7 управление” ОС. В персональных компьютерах данная философия завершения программ сохранилась (а кстати, попробуйте представить, как бы вам работалось, если бы после выхода из текстового редактора процессор каждый раз останавливался?!)

MMIX, претендующий на роль процессора нового тысячелетия, не имеет команды останова в принципе. Для завершения любой программы Кнут рекомендует передавать управление несуществующей пока операционной системе под названием NNIX: для этого последней командой программы пишется специальная системная инструкция TRAP 0, имеющая нулевой код.

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



7 именно возвращать управление, поскольку при запуске программа стартовала по инициативе ОС


На начало статьи      Дальше


© Е.А.Еремин, 2002
Статья:
Еремин Е.А. MMIX – учебный RISC-процессор нового тысячелетия от Дональда Кнута. - Газета "Информатика", 2002, N 40, с.18-27


Автор сайта - Евгений Александрович Еремин (Пермский государственный педагогический университет). e_eremin@yahoo.com


Free Web Hosting