MIESZANKA - MIX

MIESZAĆ
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 binarnydziesię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
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 (pozycja bitowa)
Rejestry
± A1 A2 A3 A4 A5 rA , akumulator
± X1 X2 X3 X4 X5 RX , rozszerzenie
Rejestry indeksowe
  ± I1.4 I1.5 rI1 , indeks 1
  ± I2.4 I2,5 rI2 , indeks 2
  ± I3.4 I3.5 rI3 , indeks 3
  ± I4.4 I4,5 rI4 , indeks 4
  ± I5.4 I5.5 rI5 , indeks 5
  ± I6.4 I6.5 rI6 , Indeks 6
Licznik programu
  J4 J5 rJ , skok
Flagi kodu warunku
  O Flaga przepełnienia
  <=> Flaga porównania

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 rAzmemory[ADDR + rIi];
CMPX ADDR,i(0:5) porównaj rXzmemory[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 rAw lewo/prawo o ADDR+rIibajty
przesunięcie (rA,rX)w lewo/prawo o ADDR+rIibajty
obrót (rA,rX)w lewo/prawo o ADDR+rIibajty
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:

Implementacja FPGA MIX została stworzona dla płyty iCE40HX8K-EVB w 2021 roku.

Zobacz też

Bibliografia

Zewnętrzne linki