BLANDA

MIX  är en hypotetisk dator som används i Donald Knuths monografi , The Art of Programming [ 1] . MIX:s datormodellnummer, 1009, kommer från en kombination av kommersiella maskinmodellnummer och namn som är samtida till den tid då boken skrevs och som verkade betydelsefulla för författaren. Dessutom är "MIX" lika med 1009 i det romerska siffersystemet .

1960-talets MIX har ersatts av en ny (också hypotetisk) datorarkitektur, MMIX , ​​som kommer att ingå i en kommande upplaga av boken. Mjukvaruimplementationer av MIX- och MMIX-arkitekturerna har utvecklats av olika författare och är fritt tillgängliga (till exempel MIXware och MMIXware utvecklade av Knuth själv).

Arkitektur

MIX är en hybrid binär decimaldator . När datorn är programmerad i binärt läge har varje byte 6 bitar (värden 0 till 63). I decimalläge har varje byte 2 decimaler (värden från 0 till 99). Byte är grupperade i ord med fem signerade byte. De flesta program skrivna för MIX kommer att fungera i både binärt och decimalläge så länge de inte försöker lagra ett värde större än 63 i en enda byte.

Ordet sträcker sig från −1.073.741.823 till 1.073.741.823 (inklusive) i binärt läge och från −9.999.999.999 till 9.999.999.999 (inklusive) i decimalläge. MIX-datorn skiljer mellan -0 och +0, vilket inte är fallet på moderna datorer, som bara har en representation av noll, men antalet negativa tal som kan representeras av ett visst antal bitar är en mer än antalet positiva siffror.

Register

MIX-datorn har 9 register :

En byte antas ha minst 6 bitar. De flesta instruktioner kan specificera vilka av fälten (bytes) i ett register som behöver ändras med hjälp av ett suffix i formuläret (först:sista). Ett nollfält är ett enbitstecken.

MIX registrerar också om den föregående operationen orsakade ett spill och en av de tre indikatorerna (mindre än, lika med eller större än). I diagrammet nedan visas varje register uppdelat i sina egna fält.

± 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

Minne och I/O

MIX-datorn har 4000 ords lagringsutrymme (vardera 5 signerade byte) adresserbar från 0 till 3999. Dessutom finns det en mängd olika in- och utenheter:

Instruktioner

Varje maskininstruktion i minnet upptar ett ord och består av 4 delar: adress (signerad 2 byte) i minnet att läsa eller skriva, indikering av indexregister (1 byte, som bestämmer vilket indexregister rI som ska användas) som ska läggas till adressen, modifiering (1 byte) som anger vilka delar av registret eller minnesplatsen som kommer att läsas eller modifieras, och op-koden (1 byte). Alla operationskoder har verbala beteckningar.

MIX-program använder ofta självmodifierande kod, särskilt för att återvända från en subrutin, eftersom MIX inte har en automatisk subrutinstack.

Program för MIX-datorn är vanligtvis skrivna på MIXAL- språket .

Ladda ner kommandon

Innehållet i fältet vid [ADDR + rIi(innehållet i register I med index i) ] laddas in i registret.

LDA ADDR, i(0 : 5) rA := minne[ ADDR + rIi ]; ladda i A
LDX ADDR, i(0 : 5) rX := minne[ ADDR + rIi ]; ladda i X
LDi ADDR, i(0 : 5) rIi := minne[ ADDR + rIi ]; ladda in i I vid index i
LDAN ADDR, i(0 : 5) rA := -minne[ ADDR + rIi ]; ladda till A med omvänt tecken
LDXN ADDR, i(0 : 5) rX := -minne[ ADDR + rIi ]; ladda in i X med omvänt tecken
LDiN ADDR, i(0 : 5) rIi := -minne[ ADDR + rIi ]; ladda i I i med omvänt tecken

Minnesskrivkommandon

Skriver innehållet i registret till minnesplatsen med adressen [ADDR + rIi]

STA ADDR, i(0 : 5) minne[ ADDR + rIi ] := rA; Skriv en
STX ADDR, i(0 : 5) minne[ ADDR + rIi ] := rX; skriv X
STi ADDR, i(0 : 5) minne[ ADDR + rIi ] := rIi; skriv II
STJ ADDR, i(0 : 5) minne[ ADDR + rIi ] := rJ; skriv J
STZ ADDR, i(0 : 5) minne[ ADDR + rIi ] := 0; återställ cellinnehåll

Aritmetiska kommandon

LÄGG TILL ADDR,i(0 : 5) rA := rA + minne[ ADDR + rIi ]; tillägg
SUB ADDR, i(0 : 5) rA := rA - minne[ ADDR + rIi ]; subtraktion
MUL ADDR, i(0 : 5) (rA, rX) := rA * minne[ADDR + rIi]; multiplikation
DIV ADDR, i(0 : 5) rA := int((rA, rX) / minne[ADDR + rIi]);
rX := (rA, rX) % minne[ADDR + rIi];
division

Adressoperationskommandon

ENTA ADDR, dvs rA:= ADDR + rIi;
ENTX ADDR,i rX:= ADDR + rIi;
ÖNHN? ADDR, dvs ri? := ADDR + rII;
ENNA ADDR, dvs rA:= -ADDR-rIi;
ENNX ADDR, dvs rX:= - ADDR - rIi;
ENN? ADDR, dvs ri? := - ADDR - rIi;
INCA ADDR, dvs rA:= rA + ADDR + rIi;
INCX ADDR,i rX:= rX + ADDR + rIi;
I.N.C.? ADDR, dvs ri? := ADDR + rII;
DECA ADDR i rA:= rA-ADDR-rIi;
DECX ADDR, dvs rX:= rX - ADDR - rIi;
DEC? ADDR, dvs ri? := ri? - ADDR - rii;

Jämförelsekommandon

CMPA ADDR, i(0 : 5) jämför rA med minne[ADDR + rIi ];
CMPX ADDR, i(0 : 5) jämför rX med minne[ADDR + rIi ];
CMP? ADDR, i(0 : 5) jämföra ri? med minne[ ADDR + rIi ];

Hoppa kommandon

JMP ADDR, dvs gå till ADDR + rii;
JSJ ADDR, dvs gå till ADDR + rii;
rJ förändras inte!
JOV ADDR, dvs if (overflow) then
   overflow := false; gå till ADDR + rii;
JNOV ADDR, dvs om (inget spill) så
   gå till ADDR + rIi;
annars spill := falskt;
JL, JE, JG ADDR, i
JGE, JNE, JLE ADDR, i
om (mindre, lika, större) sedan gå till ADDR + rIi;
om (inte mindre, ojämlikt, inte större) sedan gå till ADDR + rIi;
JAN/JAZ/JAP ADDR, jag
JANN/JANZ/JANP ADDR, dvs
om (rA < 0 eller rA == 0 eller rA > 0) så gå till ADDR + rIi;
om (rA >= 0 eller rA != 0 eller rA <= 0) då gå till ADDR + rIi;
JXN/JXZ/JXP ADDR, i
JXNN/JXNZ/JXNP ADDR, i
om (rX < 0 eller rX == 0 eller rX > 0) så gå till ADDR + rIi;
om (rX >= 0 eller rX != 0 eller rX <= 0) så gå till ADDR + rIi;
J?N/J?Z/J?P ADDR, i
J?NN/J?NZ/J?NP ADDR, i
om (rI? < 0 eller rI? == 0 eller rI? > 0) sedan gå till ADDR + rIi;
om (rI? >= 0 eller rI? != 0 eller rI? <= 0) sedan gå till ADDR + rIi;

Andra kommandon

FLYTTA ADDR, i(F) för(n = 0; n < F; n++, rI1++)
    minne[ADDR + rIi + n] := minne[rI1];
SLA/SRA ADDR, i
SLAX/SRAX ADDR, i
SLC/SRC ADDR, i
skift rA åt vänster/höger med ADDR+rIi byte
skift (rA, rX) åt vänster/höger med ADDR+rIi byte
rotera (rA, rX) åt vänster/höger med ADDR+rIi byte
NEJ göra ingenting;
HLT stoppa utförandet;

I/O-kommandon

I ADDR, i(F) läs in ett block från ingångsenhet F
till minnet[ADDR + rIi] och framåt;
OUT ADDR, i(F) mata ut ett block till enhet F
från minnet[ADDR + rIi] och framåt;
IOC ADDR, i(F) skicka styrinstruktion till i/o-enhet F;
JRED ADDR, i(F) om (i/o-enhet F är klar) så gå till ADDR + rIi;
JBUS ADDR, i(F) om (i/o-enhet F är upptagen) så gå till ADDR + rIi;

Konverteringskommandon

NUM rA := numeriskt värde för tecken i (rA,rX);
RÖDING (rA, rX):= teckenkoder som representerar värdet på rA;

Anteckningar

  1. All information i den här artikeln är hämtad från den refererade boken.

Länkar