МИКС (абстрактная машина)
Эта статья нуждается в дополнительных цитатах для проверки . ( август 2012 г. ) |
Дизайнер | Дональд Кнут |
---|---|
Биты | 31-битный |
Представлено | 1968 |
Дизайн | аккумуляторная машина |
Тип | гипотетический |
Кодирование | Зафиксированный |
Ветвление | Код состояния и проверка регистра |
Порядок байтов | Большой |
Открыть | Да, и без лицензионных отчислений |
Регистры | |
всего 9 |
MIX — это гипотетический компьютер Дональда Кнута , использованный в монографии «Искусство компьютерного программирования» ( TAOCP ). Номер модели MIX — 1009, который был получен путем объединения номеров моделей и названий нескольких современных коммерческих машин, которые автор считает важными. Кроме того, «MIX», прочитанная как римская цифра, равна 1009.
MIX 1960-х годов с тех пор был заменен новой (также гипотетической) компьютерной архитектурой MMIX , которая будет включена в будущие выпуски TAOCP .
Программные реализации для архитектур MIX и MMIX были разработаны Кнутом и размещены в свободном доступе (названные «MIXware» и «MMIXware» соответственно). Также существует несколько производных эмуляторов MIX/MMIX Кнута. GNU MDK — один из таких программных пакетов; он бесплатен и работает на самых разных платформах.
Их образовательная цель очень похожа на Джона Л. Хеннесси и Дэвида А. Паттерсона из архитектуру DLX книги «Компьютерная организация и проектирование — Интерфейс аппаратного и программного обеспечения» .
Архитектура [ править ]
MIX — это гибридный двоично - десятичный компьютер. При программировании в двоичном формате каждый байт имеет 6 бит (значения варьируются от 0 до 63). В десятичной системе каждый байт имеет две десятичные цифры (значения варьируются от 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 также записывает, произошло ли переполнение предыдущей операции, и имеет индикатор сравнения с одной тритой (меньше, равно или больше).
Память и ввод/вывод [ править ]
Машина 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] and set comparison flag;
|
CMPX ADDR,i(0:5)
|
сравнивать rX с memory[ADDR + rIi] and set comparison flag;
|
CMP? ADDR,i(0:5)
|
сравнивать rI? с memory[ADDR + rIi] and set comparison flag;
|
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
|
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[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); микс [1] и
- Аппаратное обеспечение::Simulator::MIX на CPAN . [2]
Реализация MIX была создана для платы FPGA iCE40HX8K в 2021 году. [3]
См. также [ править ]
Ссылки [ править ]
- ^ – 9 лицевая страница руководства
- ^ Аппаратное обеспечение::Simulator::MIX Perl -модуль из CPAN
- ^ «Майкл Шрёдер/микс-фгпа» . ГитЛаб .
Внешние ссылки [ править ]
- MMIX 2009: RISC-компьютер для третьего тысячелетия Официальная страница MIX Кнута
- Новости MMIX Официальные новости MIX Кнута
- MIX: дизайн типичного компьютера и его язык ассемблера в Открытой библиотеке Интернет -архива , оригинальной официальной книге Кнута по MIX 1970 года с Томом Миксом на обложке.
- MMIXware: RISC-компьютер для третьего тысячелетия. Официальная книга MIX Кнута.
- MIX-MMIX/MIXAL-MMIXAL в Керли