MIESZANKA - MIX
Projektant | Donald Knuth |
---|---|
Bity | 31-bitowy |
Wprowadzono | 1968 |
Projekt | maszyna akumulatorowa |
Rodzaj | hipotetyczny |
Kodowanie | Naprawiony |
Rozgałęzienia | Kod stanu i test rejestru |
Endianizm | Duża |
otwarty | Tak, i bez tantiem |
Rejestry | |
9 w sumie |
MIX to hipotetyczny komputer używany w monografii Donalda Knutha The Art of Computer Programming ( TAOCP ). Numer modelu MIX to 1009, który został uzyskany przez połączenie numerów modeli i nazw kilku współczesnych, komercyjnych maszyn uznanych przez autora za znaczące. Ponadto „MIX” czytane jako cyfra rzymska to 1009.
MIX z lat 60. został od tego czasu zastąpiony przez nową (również hipotetyczną) architekturę komputerową, MMIX , która zostanie włączona do nadchodzących edycji TAOCP .
Implementacje oprogramowania dla architektur MIX i MMIX zostały opracowane przez firmę Knuth i udostępnione bezpłatnie (oznaczone odpowiednio jako „MIXware” i „MMIXware”). Istnieje również kilka pochodnych emulatorów MIX/MMIX firmy Knuth. Jednym z takich pakietów oprogramowania jest GNU MDK ; jest bezpłatny i działa na wielu różnych platformach.
Ich celem edukacji jest bardzo podobna do John L. Hennessy „s i David A. Patterson ” s DLX architektury, od Organizacji i Projektowania - Computer Hardware interfejs oprogramowania .
Architektura
MIX to hybrydowy komputer binarny – dziesiętny . W przypadku programowania binarnego każdy bajt ma 6 bitów (wartości w zakresie od 0 do 63). W systemie dziesiętnym każdy bajt ma 2 cyfry dziesiętne (wartości w zakresie od 0 do 99). Bajty są pogrupowane w słowa po pięć bajtów plus znak. Większość programów napisanych dla MIXa będzie działać w formacie binarnym lub dziesiętnym, o ile nie będą próbowały przechowywać wartości większej niż 63 w jednym bajcie.
Słowo ma zakres od -1 073 741 823 do 1 073 741 823 (włącznie) w trybie binarnym i od -9 999 999 999 do 9 999 999 999 (włącznie) w trybie dziesiętnym. Reprezentacja znaków i wielkości liczb całkowitych w architekturze MIX rozróżnia „−0” i „+0”. Kontrastuje to ze współczesnymi komputerami, których reprezentacja dwójkowa liczb całkowitych zawiera pojedynczą reprezentację dla zera, ale których zakres dla danej liczby bitów obejmuje jedną liczbę całkowitą ujemną więcej niż liczba reprezentowalnych liczb całkowitych dodatnich.
Rejestry MIX | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Rejestry
W MIXie jest 9 rejestrów :
- rA : Akumulator (pełne słowo, pięć bajtów i znak).
- rX : Rozszerzenie (pełne słowo, pięć bajtów i znak).
- rI1 , rI2 , rI3 , rI4 , rI5 , rI6 : Rejestry indeksowe (dwa bajty i znak).
- rJ : Adres skoku (dwa bajty, zawsze dodatnie).
Zakłada się, że bajt ma co najmniej 6 bitów. Większość instrukcji może określać, które z "pól" (bajtów) rejestru mają zostać zmienione, używając sufiksu postaci (first:last) . Pole zero to znak jednobitowy.
MIX rejestruje również, czy poprzednia operacja została przepełniona, i ma wskaźnik porównania jednokrotnego (mniejszy niż, równy lub większy niż).
Pamięć i wejście/wyjście
Maszyna MIX ma 4000 słów pamięci (każde z 5 bajtami i znakiem), adresowane od 0 do 3999. Uwzględniono również różne urządzenia wejściowe i wyjściowe:
- Jednostki taśmowe (urządzenia 0…7).
- Zespoły dysków lub bębna (urządzenia 8…15).
- Czytnik kart (urządzenie 16).
- Dziurkacz do kart (urządzenie 17).
- Drukarka liniowa (urządzenie 18).
- Terminal do pisania (urządzenie 19).
- Taśma papierowa (urządzenie 20).
Instrukcje
Każda instrukcja maszynowa w pamięci zajmuje jedno słowo i składa się z 4 części: adres (2 bajty i znak słowa) w pamięci do odczytu lub zapisu; specyfikację indeksu (1 bajt, opisującą, którego rejestru indeksu rI użyć), aby dodać go do adresu; modyfikacja (1 bajt), która określa, które części rejestru lub komórki pamięci zostaną odczytane lub zmienione; oraz kod operacji (1 bajt). Wszystkie kody operacji mają przypisany mnemonik.
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 |
± | Adres | Indeks | Modyfikacja | Operacja |
Programy MIX często używają samomodyfikującego się kodu, w szczególności do powrotu z podprogramu, ponieważ MIX nie ma automatycznego stosu powrotu podprogramu. Kod samomodyfikujący jest ułatwiony przez bajt modyfikacji, pozwalający programowi na przechowywanie danych, na przykład, w części adresowej instrukcji docelowej, pozostawiając resztę instrukcji niezmodyfikowaną.
Programy MIX są zazwyczaj konstruowane przy użyciu języka asemblera MIXAL; na przykład zobacz stronę z listą programów 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)
|
porównaj rA zmemory[ADDR + rIi];
|
CMPX ADDR,i(0:5)
|
porównaj rX zmemory[ADDR + rIi];
|
CMP? ADDR,i(0:5)
|
porównaj rI? zmemory[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
|
jeśli (rI?<0 lub rI?==0 lub rI?>0) to przejdź do ADDR + rIi; jeśli (rI?>=0 lub rI?!=0 lub rI?<=0) to przejdź do 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
|
przesunięcie rA w lewo/prawo o ADDR+rIi bajty przesunięcie (rA,rX) w lewo/prawo o ADDR+rIi bajty obrót (rA,rX) w lewo/prawo o ADDR+rIi bajty
|
NOP
|
nic nie robić; |
HLT
|
zatrzymać wykonanie; |
IN ADDR,i(F)
|
czytać w jednym bloku od jednostki wejściowej F do memory[ADDR + rIi] dalej;
|
OUT ADDR,i(F)
|
wysyłaj jeden blok do jednostki F od memory[ADDR + rIi] początku;
|
IOC ADDR,i(F)
|
wyślij instrukcję sterującą do jednostki we/wy 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;
|
Realizacje
MIX został wdrożony w oprogramowaniu przez:
- MIXWare Knutha i pochodne GNU MDK ;
- miks 9frontów (1); oraz
- Sprzęt::Symulator::MIX na CPAN .
Implementacja FPGA MIX została stworzona dla płyty iCE40HX8K-EVB w 2021 roku.
Zobacz też
Bibliografia
Zewnętrzne linki
- MMIX 2009: Komputer RISC dla oficjalnej strony MIX trzeciego tysiąclecia Knutha
- Wiadomości MMIX Oficjalne wiadomości MIX firmy Knuth
- MIX: projekt typowego komputera i jego języka asemblera w Open Library at the Internet Archive , oryginalnej oficjalnej książce Knutha z 1970 roku o MIX, z Tomem Mixem na okładce.
- MMIXware: komputer RISC do oficjalnej książki MIX trzeciego tysiąclecia Knutha
- MIX-MMIX/MIXAL-MMIXAL w Curlie