Данному образовательному сайту пришлось несколько раз менять свое имя. С 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.

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

1. Пример на вычисления

Пусть мы хотим вычислить сумму двух целых чисел: A, которое хранится с адреса 11016, и B (11816). Программа для решения этой простейшей задачи на MMIX будет иметь вид:

адрес код мнемоника действие комментарий
0…0 E3 01 0110 SETL $1, 0110 $1 <== 0…110 A в $1
0…4 8D 00 01 00 LDO $0, $1, 0 $0 <== ($1+0) считать A из ОЗУ в $0
0…8 8D 02 01 08 LDO $2, $1, 8 $2 <== ($1+8) считать B из ОЗУ в $2
0…C 20 00 00 02 ADD $0, $0, $2 $0 <== $0 + $2 A + B в $0
0…10 00 000000 TRAP 0 выход в ОС завершение задачи

Напомним читателям, что команды в MMIX занимают по 4 байта (отсюда нумерация в первом столбике), а целые числа – 8 байт.

Интересно, что для нахождения суммы вещественных чисел достаточно просто изменить код операции сложения в предпоследней команде.

2. Модуль числа

Вычислим модуль целого числа N, хранящегося в регистре $1, и поместим результат в регистр $2. Вспомним, что для неотрицательных чисел модуль равен самому числу, а в противном случае результат равен разности 0 – N.

адрес код мнемоника действие комментарий
0…0 21 02 01 00 ADDI $2, $1, 0 $2 <== $1 +0 скопировать $1 в $2
0…4 48 02 0002 BNN $0, +2 к 0…C при $2>=0 обход, если $2 >= 0
0…8

34 02 00 02 NEG $2, 0, $2 $2 <== 0 – $2 получить –N
0…С 00 000000 TRAP 0 выход в ОС завершение задачи

Как оказалось, MMIX не имеет специальных инструкций для переписи содержимого из одного регистра в другой. Поэтому в первой команде программы ее пришлось искусственно создать путем сложения с нулем (в описании Кнута мне не попадалось никаких рекомендаций по этому поводу, но применяемая хитрость выглядит вполне “по-кнутовски”).

3. Копирование массива

Скопируем байты 100-14F в область 200-24F.

адрес код мнемоника действие комментарий
0…0 E3 01 0100 SETL $1, 0100 $1 <== 0…100 адрес I массива
0…4 E3 02 0200 SETL $2, 0200 $2 <== 0…200 адрес II массива
0…8 E3 03 004F SETL $3, 004F $3 <== 0…4F для послед. адреса
0…C 82 00 01 03 LDBU $0, $1, $3 $0 <== ($1 +$3) прочитать байт
0…10 A2 00 02 03 STBU $0, $2, $3 ($2 + $3) <== $0 записать байт
0…14 25 03 03 01 SUBI $3, $3, 1 $3 <== $3 – 1 -1 из счетчика
0…18 48 03 FFFD BNN $3, – 3 к 0...C при $3 >= 0 к повторению
0…1C 00 000000 TRAP 0 выход в ОС завершение задачи

С технической точки зрения оказывается удобнее копировать массив начиная с больших адресов. Начальный адрес исходного массива помещается в $1, а адрес копии – в $2. Для смещения по массиву используется регистр $3, пробегающий значения от 4F до 0 (последний копируемый байт). При следующем вычитании в $3 получается отрицательный результат и цикл завершается.

Регистр $0, как уже догадался читатель, использован в качестве рабочего для временного хранения значения очередного байта.

перепись массива

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


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


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


Free Web Hosting