MIX

Поделись знанием:
Перейти к: навигация, поиск

MIX — это гипотетический компьютер, использованный в монографии Дональда Кнута, «Искусство программирования»[1]. Номер модели компьютера MIX — 1009, происходит от комбинации номеров и названий коммерческих моделей машин, современных времени написания книги и показавшихся автору значимыми. Кроме того, «MIX» равняется 1009 в Римской системе счисления.

MIX 1960-х был заменён новой (также гипотетической) компьютерной архитектурой, MMIX, которая будет включена в ожидаемой редакции TAOCP. Программные реализации MIX и MMIX архитектур были разработаны различными авторами и свободно доступны (например, разработанные самим Кнутом MIXware и MMIXware).





Архитектура

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

Слово изменяется в пределах от −1.073.741.823 до 1.073.741.823 (включительно) в бинарном режиме и от −9.999.999.999 до 9.999.999.999 (включительно) в десятичном режиме. В компьютере MIX различаются числа −0 и +0, чего нет на современных компьютерах, в которых есть только одно представление нуля, но количество отрицательных чисел, которые могут быть представлены определённым числом бит, на единицу больше количества положительных чисел.

Регистры

В компьютере MIX 9 регистров:

  • rA: Аккумуляторный регистр (accumulator)(полное слово (full word), пять байт со знаком);
  • rX: Расширение (extension) (полное слово, пять байт со знаком);
  • rI1, rI2, rI3, rI4, rI5, rI6: Индексные регистры (Два байта и знак);
  • rJ: Адрес перехода (два байта, всегда положительный).

Полагается, что байт имеет, как минимум, 6 бит. Большинство инструкций могут указывать, какие из полей (байт) регистра требуется изменить, используя суффикс в форме (первый: последний). Нулевое поле — однобитовый знак.

MIX также записывает, вызвала ли предыдущая операция переполнение и один из трёх индикаторов (меньше, равно или больше). На диаграмме ниже каждый регистр показан разделённым на свои поля.

± A1 A2 A3 A4 A5
± X1 X2 X3 X4 X5
+ J4 J5
OV?
<=>?
± I1.4 I1.5
± I2.4 I2.5
± I3.4 I3.5
± I4.4 I4.5
± I5.4 I5.5
± I6.4 I6.5

Память и ввод-вывод

Компьютер MIX имеет 4000 слов хранения (каждый по 5 байт со знаком), адресуемых с 0 до 3999. Кроме того, есть множество устройств ввода и вывода:

  • Магнитофонные устройства (устройства 0 … 7);
  • Диск или барабанные устройства (устройства 8 … 15);
  • Устройство чтения карт (устройство 16);
  • Карточный перфоратор (устройство 17);
  • Построчный принтер (устройство 18);
  • Пишущая машинка (устройство 19);
  • Перфолента (устройство 20).

Инструкции

Каждая машинная инструкция в памяти занимает одно слово и состоит из 4 частей: адрес (2 байта со знаком) в памяти для чтения или записи, указание индексного регистра (1 байт, определяющий, какой индексный регистр rI использовать) для добавления к адресу, модификация (1 байт), определяющая, какие части регистра или ячейки памяти будут прочитаны или изменены, и код операции (1 байт). Все коды операции имеют словесные обозначения.

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

Программы для компьютера MIX обычно пишутся на языке MIXAL.

Команды загрузки

Содержимое поля по адресу [ ADDR + rIi(содержимое регистра I с индексом i) ] загружается в регистр.

LDA ADDR, i(0 : 5) rA := memory[ ADDR + rIi ]; загрузить в A
LDX ADDR, i(0 : 5) rX := memory[ ADDR + rIi ]; загрузить в X
LDi ADDR, i(0 : 5) rIi := memory[ ADDR + rIi ]; загрузить в I с индексом i
LDAN ADDR, i(0 : 5) rA := -memory[ ADDR + rIi ]; загрузить в A с обратным знаком
LDXN ADDR, i(0 : 5) rX := -memory[ ADDR + rIi ]; загрузить в X с обратным знаком
LDiN ADDR, i(0 : 5) rIi := -memory[ ADDR + rIi ]; загрузить в Ii с обратным знаком

Команды записи в память

Записывает содержимое регистра в ячейку памяти с адресом [ ADDR + rIi ]

STA ADDR, i(0 : 5) memory[ ADDR + rIi ] := rA; записать A
STX ADDR, i(0 : 5) memory[ ADDR + rIi ] := rX; записать X
STi ADDR, i(0 : 5) memory[ ADDR + rIi ] := rIi; записать Ii
STJ ADDR, i(0 : 5) memory[ ADDR + rIi ] := rJ; записать J
STZ ADDR, i(0 : 5) memory[ ADDR + rIi ] := 0; обнулить содержимое ячейки

Арифметические команды

ADD ADDR, i(0 : 5) rA := rA + memory[ ADDR + rIi ]; сложение
SUB ADDR, i(0 : 5) rA := rA - memory[ ADDR + rIi ]; вычитание
MUL ADDR, i(0 : 5) (rA, rX) := rA * memory[ ADDR + rIi ]; умножение
DIV ADDR, i(0 : 5) rA := int((rA, rX) / memory[ ADDR + rIi ]);
rX := (rA, rX) % memory[ ADDR + rIi ];
деление

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

ENTA ADDR, i rA := ADDR + rIi;
ENTX ADDR, i rX := ADDR + rIi;
ENT? ADDR, i rI? := ADDR + rIi;
ENNA ADDR, i rA := - ADDR - rIi;
ENNX ADDR, i rX := - ADDR - rIi;
ENN? ADDR, i rI? := - ADDR - rIi;
INCA ADDR, i rA := rA + ADDR + rIi;
INCX ADDR, i rX := rX + ADDR + rIi;
INC? ADDR, i rI? := ADDR + rIi;
DECA ADDR, i rA := rA - ADDR - rIi;
DECX ADDR, i rX := rX - ADDR - rIi;
DEC? ADDR, i rI? := rI? - ADDR - rIi;

Команды сравнения

CMPA ADDR, i(0 : 5) compare rA with memory[ ADDR + rIi ];
CMPX ADDR, i(0 : 5) compare rX with memory[ ADDR + rIi ];
CMP? ADDR, i(0 : 5) compare rI? with memory[ ADDR + rIi ];

Команды перехода

JMP ADDR, i goto ADDR + rIi;
JSJ ADDR, i goto ADDR + rIi;
rJ не меняется!
JOV ADDR, i if (overflow) then
   overflow := false; goto ADDR + rIi;
JNOV ADDR, i if (no overflow) then
   goto ADDR + rIi;
else overflow := false;
JL, JE, JG ADDR, i
JGE, JNE, JLE ADDR, i
if (less, equal, greater) then goto ADDR + rIi;
if (no less, unequal, no greater) then goto ADDR + rIi;
JAN/JAZ/JAP ADDR, i
JANN/JANZ/JANP ADDR, i
if (rA < 0 or rA == 0 or rA > 0) then goto ADDR + rIi;
if (rA >= 0 or rA != 0 or rA <= 0) then goto ADDR + rIi;
JXN/JXZ/JXP ADDR, i
JXNN/JXNZ/JXNP ADDR, i
if (rX < 0 or rX == 0 or rX > 0) then goto ADDR + rIi;
if (rX >= 0 or rX != 0 or rX <= 0) then goto ADDR + rIi;
J?N/J?Z/J?P ADDR, i
J?NN/J?NZ/J?NP ADDR, i
if (rI? < 0 or rI? == 0 or rI? > 0) then goto ADDR + rIi;
if (rI? >= 0 or rI? != 0 or rI? <= 0) then goto ADDR + rIi;

Другие команды

MOVE ADDR, i(F) for(n = 0; n < F; n++, rI1++)
    memory[ ADDR + rIi + n ] := memory[ rI1 ];
SLA/SRA ADDR, i
SLAX/SRAX ADDR, i
SLC/SRC ADDR, i
shift rA to the left/right by ADDR+rIi bytes
shift (rA, rX) to the left/right by ADDR+rIi bytes
rotate (rA, rX) to the left/right by ADDR+rIi bytes
NOP do nothing;
HLT halt execution;

Команды ввода-вывода

IN ADDR, i( F ) read in one block from input unit F
into memory[ ADDR + rIi ] onwards;
OUT ADDR, i( F ) output one block to unit F
from memory[ ADDR + rIi ] onwards;
IOC ADDR, i( F ) send control instruction to i/o unit F;
JRED ADDR, i( F ) if (i/o unit F is ready) then goto ADDR + rIi;
JBUS ADDR, i( F ) if (i/o unit F is busy) then goto ADDR + rIi;

Команды преобразования

NUM rA := numerical value of characters in ( rA,rX );
CHAR ( rA, rX ) := character codes representing value of rA;

Напишите отзыв о статье "MIX"

Примечания

  1. Вся информация в этой статье взята из указанной книги

Ссылки

  • [www-cs-faculty.stanford.edu/~knuth/mmix.html MMIX 2009: A RISC Computer for the Third Millennium] Knuth’s official MIX page
  • [www-cs-faculty.stanford.edu/~knuth/mmix-news.html MMIX News] Knuth’s official MIX news
  • [www-cs-faculty.stanford.edu/~knuth/mmixware.html MMIXware: A RISC Computer for the Third Millennium] Knuth’s official MIX book
  • [dmoz.org/Computers/Programming/Languages/Assembly/MIX-MMIX Open Directory: Computers: Programming: Languages: Assembly: MIX-MMIX] many MIX-MMIX/MIXAL-MMIXAL links

Отрывок, характеризующий MIX

На крыльце стоял Петя, занимавшийся вооружением людей, которые ехали из Москвы. На дворе все так же стояли заложенные подводы. Две из них были развязаны, и на одну из них влезал офицер, поддерживаемый денщиком.
– Ты знаешь за что? – спросил Петя Наташу (Наташа поняла, что Петя разумел: за что поссорились отец с матерью). Она не отвечала.
– За то, что папенька хотел отдать все подводы под ранепых, – сказал Петя. – Мне Васильич сказал. По моему…
– По моему, – вдруг закричала почти Наташа, обращая свое озлобленное лицо к Пете, – по моему, это такая гадость, такая мерзость, такая… я не знаю! Разве мы немцы какие нибудь?.. – Горло ее задрожало от судорожных рыданий, и она, боясь ослабеть и выпустить даром заряд своей злобы, повернулась и стремительно бросилась по лестнице. Берг сидел подле графини и родственно почтительно утешал ее. Граф с трубкой в руках ходил по комнате, когда Наташа, с изуродованным злобой лицом, как буря ворвалась в комнату и быстрыми шагами подошла к матери.
– Это гадость! Это мерзость! – закричала она. – Это не может быть, чтобы вы приказали.
Берг и графиня недоумевающе и испуганно смотрели на нее. Граф остановился у окна, прислушиваясь.
– Маменька, это нельзя; посмотрите, что на дворе! – закричала она. – Они остаются!..
– Что с тобой? Кто они? Что тебе надо?
– Раненые, вот кто! Это нельзя, маменька; это ни на что не похоже… Нет, маменька, голубушка, это не то, простите, пожалуйста, голубушка… Маменька, ну что нам то, что мы увезем, вы посмотрите только, что на дворе… Маменька!.. Это не может быть!..
Граф стоял у окна и, не поворачивая лица, слушал слова Наташи. Вдруг он засопел носом и приблизил свое лицо к окну.
Графиня взглянула на дочь, увидала ее пристыженное за мать лицо, увидала ее волнение, поняла, отчего муж теперь не оглядывался на нее, и с растерянным видом оглянулась вокруг себя.
– Ах, да делайте, как хотите! Разве я мешаю кому нибудь! – сказала она, еще не вдруг сдаваясь.
– Маменька, голубушка, простите меня!
Но графиня оттолкнула дочь и подошла к графу.
– Mon cher, ты распорядись, как надо… Я ведь не знаю этого, – сказала она, виновато опуская глаза.
– Яйца… яйца курицу учат… – сквозь счастливые слезы проговорил граф и обнял жену, которая рада была скрыть на его груди свое пристыженное лицо.
– Папенька, маменька! Можно распорядиться? Можно?.. – спрашивала Наташа. – Мы все таки возьмем все самое нужное… – говорила Наташа.
Граф утвердительно кивнул ей головой, и Наташа тем быстрым бегом, которым она бегивала в горелки, побежала по зале в переднюю и по лестнице на двор.
Люди собрались около Наташи и до тех пор не могли поверить тому странному приказанию, которое она передавала, пока сам граф именем своей жены не подтвердил приказания о том, чтобы отдавать все подводы под раненых, а сундуки сносить в кладовые. Поняв приказание, люди с радостью и хлопотливостью принялись за новое дело. Прислуге теперь это не только не казалось странным, но, напротив, казалось, что это не могло быть иначе, точно так же, как за четверть часа перед этим никому не только не казалось странным, что оставляют раненых, а берут вещи, но казалось, что не могло быть иначе.
Все домашние, как бы выплачивая за то, что они раньше не взялись за это, принялись с хлопотливостью за новое дело размещения раненых. Раненые повыползли из своих комнат и с радостными бледными лицами окружили подводы. В соседних домах тоже разнесся слух, что есть подводы, и на двор к Ростовым стали приходить раненые из других домов. Многие из раненых просили не снимать вещей и только посадить их сверху. Но раз начавшееся дело свалки вещей уже не могло остановиться. Было все равно, оставлять все или половину. На дворе лежали неубранные сундуки с посудой, с бронзой, с картинами, зеркалами, которые так старательно укладывали в прошлую ночь, и всё искали и находили возможность сложить то и то и отдать еще и еще подводы.
– Четверых еще можно взять, – говорил управляющий, – я свою повозку отдаю, а то куда же их?
– Да отдайте мою гардеробную, – говорила графиня. – Дуняша со мной сядет в карету.
Отдали еще и гардеробную повозку и отправили ее за ранеными через два дома. Все домашние и прислуга были весело оживлены. Наташа находилась в восторженно счастливом оживлении, которого она давно не испытывала.
– Куда же его привязать? – говорили люди, прилаживая сундук к узкой запятке кареты, – надо хоть одну подводу оставить.
– Да с чем он? – спрашивала Наташа.
– С книгами графскими.
– Оставьте. Васильич уберет. Это не нужно.
В бричке все было полно людей; сомневались о том, куда сядет Петр Ильич.
– Он на козлы. Ведь ты на козлы, Петя? – кричала Наташа.
Соня не переставая хлопотала тоже; но цель хлопот ее была противоположна цели Наташи. Она убирала те вещи, которые должны были остаться; записывала их, по желанию графини, и старалась захватить с собой как можно больше.


Во втором часу заложенные и уложенные четыре экипажа Ростовых стояли у подъезда. Подводы с ранеными одна за другой съезжали со двора.
Коляска, в которой везли князя Андрея, проезжая мимо крыльца, обратила на себя внимание Сони, устраивавшей вместе с девушкой сиденья для графини в ее огромной высокой карете, стоявшей у подъезда.
– Это чья же коляска? – спросила Соня, высунувшись в окно кареты.
– А вы разве не знали, барышня? – отвечала горничная. – Князь раненый: он у нас ночевал и тоже с нами едут.
– Да кто это? Как фамилия?
– Самый наш жених бывший, князь Болконский! – вздыхая, отвечала горничная. – Говорят, при смерти.
Соня выскочила из кареты и побежала к графине. Графиня, уже одетая по дорожному, в шали и шляпе, усталая, ходила по гостиной, ожидая домашних, с тем чтобы посидеть с закрытыми дверями и помолиться перед отъездом. Наташи не было в комнате.
– Maman, – сказала Соня, – князь Андрей здесь, раненый, при смерти. Он едет с нами.
Графиня испуганно открыла глаза и, схватив за руку Соню, оглянулась.
– Наташа? – проговорила она.
И для Сони и для графини известие это имело в первую минуту только одно значение. Они знали свою Наташу, и ужас о том, что будет с нею при этом известии, заглушал для них всякое сочувствие к человеку, которого они обе любили.
– Наташа не знает еще; но он едет с нами, – сказала Соня.
– Ты говоришь, при смерти?
Соня кивнула головой.
Графиня обняла Соню и заплакала.
«Пути господни неисповедимы!» – думала она, чувствуя, что во всем, что делалось теперь, начинала выступать скрывавшаяся прежде от взгляда людей всемогущая рука.