СМЕСЬ - MIX
Дизайнер | Дональд Кнут |
---|---|
Биты | 31-битный |
Введено | 1968 г. |
Дизайн | аккумуляторная машина |
Тип | гипотетический |
Кодирование | Фиксированный |
Разветвление | Код состояния и проверка регистра |
Порядок байтов | Большой |
Открытым | Да, и без лицензионных отчислений |
Регистры | |
Всего 9 |
MIX - это гипотетический компьютер, использованный в монографии Дональда Кнута « Искусство компьютерного программирования» ( TAOCP ). Номер модели MIX - 1009, который был получен путем объединения номеров моделей и названий нескольких современных коммерческих машин, которые автор считает важными. Кроме того, «MIX» читается как римская цифра 1009.
На смену MIX 1960-х годов пришла новая (тоже гипотетическая) компьютерная архитектура MMIX , которая будет включена в следующие выпуски TAOCP .
Программные реализации как для архитектур MIX, так и для MMIX были разработаны Knuth и сделаны в свободном доступе (названные «MIXware» и «MMIXware» соответственно). Также существует несколько производных эмуляторов MIX / MMIX Кнута. GNU MDK - один из таких программных пакетов; он бесплатный и работает на самых разных платформах.
Их цель образования очень похожа на Джон Л. Хеннесси «s и David A. Patterson » s DLX архитектуру, от компьютера Организации и дизайна - Аппаратный интерфейс программного обеспечения .
Архитектура
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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Регистры
В MIX 9 регистров :
- rA : Аккумулятор (полное слово, пять байтов и знак).
- rX : расширение (полное слово, пять байтов и знак).
- rI1 , rI2 , rI3 , rI4 , rI5 , rI6 : индексные регистры (два байта и знак).
- rJ : адрес перехода (два байта, всегда положительный).
Предполагается, что байт должен быть не менее 6 бит. В большинстве инструкций можно указать, какое из «полей» (байтов) регистра должно быть изменено, используя суффикс формы (первое: последнее) . Нулевое поле - это однобитовый знак.
MIX также записывает ли переполнение предыдущей операции, и имеет одно- Trit индикатора сравнения (меньше, равно или больше , чем).
Память и ввод / вывод
Машина MIX имеет 4000 слов памяти (каждое с 5 байтами и знаком) с адресами от 0 до 3999. Также включены различные устройства ввода и вывода:
- Ленточные блоки (устройства 0… 7).
- Дисковые или барабанные агрегаты (аппараты 8… 15).
- Картридер (устройство 16).
- Карточный перфоратор (устройство 17).
- Линейный принтер (устройство 18).
- Терминал для пишущей машинки (прибор 19).
- Бумажная лента (прибор 20).
инструкции
Каждая машинная инструкция в памяти занимает одно слово и состоит из 4 частей: адреса (2 байта и знак слова) в памяти для чтения или записи; спецификацию индекса (1 байт, описывающий, какой регистр индекса rI использовать) для добавления к адресу; модификация (1 байт), которая указывает, какие части регистра или ячейки памяти будут прочитаны или изменены; и код операции (1 байт). Все коды операций имеют связанную мнемонику.
3 0 | 2 9 | 2 8 | 2 7 | 2 6 | 2 5 | 2 4 | 2 3 | 2 2 | 2 1 | 2 0 | 1 9 | 1 8 | 1 7 | 1 6 | 1 5 | 1 4 | 1 3 | 1 2 | 1 1 | 1 0 | 0 9 | 0 8 | 0 7 | 0 6 | 0 5 | 0 4 | 0 3 | 0 2 | 0 1 | 0 0 |
± | Адрес | Показатель | Модификация | Операция |
Программы MIX часто используют самомодифицирующийся код, в частности, для возврата из подпрограммы, поскольку в MIX отсутствует стек автоматического возврата подпрограммы. Самомодифицирующемуся коду способствует байт модификации, позволяющий программе сохранять данные, например, в адресной части целевой инструкции, оставляя остальную часть инструкции неизменной.
Программы MIX обычно создаются с использованием языка ассемблера MIXAL; например, см. страницу со списком программ hello world .
LDA ADDR,i(0:5)
|
rA := memory[ADDR + rIi];
|
---|---|
LDX ADDR,i(0:5)
|
rX := memory[ADDR + rIi];
|
LD? ADDR,i(0:5)
|
rI? := memory[ADDR + rIi];
|
LDAN ADDR,i(0:5)
|
rA := - memory[ADDR + rIi];
|
LDXN ADDR,i(0:5)
|
rX := - memory[ADDR + rIi];
|
LD?N ADDR,i(0:5)
|
rI? := - memory[ADDR + rIi];
|
STA ADDR,i(0:5)
|
memory[ADDR + rIi] := rA;
|
STX ADDR,i(0:5)
|
memory[ADDR + rIi] := rX;
|
ST? ADDR,i(0:5)
|
memory[ADDR + rIi] := rI?;
|
STJ ADDR,i(0:5)
|
memory[ADDR + rIi] := rJ;
|
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? := 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)
|
сравнить rA сmemory[ADDR + rIi];
|
CMPX ADDR,i(0:5)
|
сравнить rX сmemory[ADDR + rIi];
|
CMP? ADDR,i(0:5)
|
сравнить rI? сmemory[ADDR + rIi];
|
JMP ADDR,i
|
rJ := address of next instruction;
goto ADDR + rIi;
|
JSJ ADDR,i
|
goto ADDR + rIi;
|
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
|
если (rI? <0 или rI? == 0 или rI?> 0), то перейти к ADDR + rIi; если (rI?> = 0 или rI?! = 0 или rI? <= 0), то перейти к ADDR + rIi; |
MOVE ADDR,i(F)
|
for (n = 0; n < F; n++, rI1++)
memory[rI1] := memory[ADDR+rIi+n];
|
SLA/SRA ADDR,i SLAX/SRAX ADDR,i SLC/SRC ADDR,i
|
сдвиг rA влево / вправо на ADDR+rIi байты сдвиг (rA,rX) влево / вправо на ADDR+rIi байты поворот (rA,rX) влево / вправо на ADDR+rIi байты
|
NOP
|
ничего не делать; |
HLT
|
остановить исполнение; |
IN ADDR,i(F)
|
чтения в одном блоке из блока ввода F в memory[ADDR + rIi] год;
|
OUT ADDR,i(F)
|
Выход один блок в блок F из memory[ADDR + rIi] года;
|
IOC ADDR,i(F)
|
отправить команду управления на блок ввода / вывода 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 реализовано:
- MIXWare Кнута и производный GNU MDK ;
- Микс 9front (1); а также
- Оборудование :: Симулятор :: MIX на CPAN .
Реализация MIX на ПЛИС была создана для платы iCE40HX8K-EVB в 2021 году.
Смотрите также
использованная литература
внешние ссылки
- MMIX 2009: RISC-компьютер для официальной страницы MIX Кнута в третьем тысячелетии
- Новости MMIX Официальные новости MIX Кнута
- MIX: дизайн типичного компьютера и его язык ассемблера в Open Library в Internet Archive , оригинальной официальной книге Кнута 1970 года MIX, с Томом Миксом на обложке.
- MMIXware: RISC-компьютер для официальной книги MIX Кнута в третьем тысячелетии
- MIX-MMIX / MIXAL-MMIXAL в Curlie