Lösung

6.4 MMIX-Programme
235
q) Geben Sie Befehle an, die
• ein neues globales Register anlegen und dieses mit Speicheradresse
0x2000000000000000 initialisieren,
• an dieser Speicheradresse ein 64 Bit breites Datenwort anlegen, das mit
4 initialisiert wird und über die Marke N angesprochen werden kann,
• an den darauffolgenden Speicheradressen zwei 4-dimensionale Vektoren
wie folgt anlegen:
• Der erste Vektor soll über ADR_A1 ansprechbar sein und mit den
64 Bit-Zahlen [1, 2, 3, 4] initialisert werden;
• der zweite Vektor soll über ADR_A2 ansprechbar sein und mit den
64 Bit-Zahlen [10, 20, 30, 40] initialisiert werden.
N
ADR_A1
ADR_A2
LOC
GREG
Data_Segment
@
OCTA
OCTA
OCTA
OCTA
OCTA
OCTA
OCTA
OCTA
OCTA
4
1
2
3
4
10
20
30
40
236
T
r)
6 MMIX-Prozessor
Geben Sie Befehle an, die
• ein neues globales Register anlegen und dieses mit Speicheradresse
0x2000000000000000 initialisieren,
• an dieser Speicheradresse ein 64 Bit breites Datenwort anlegen, das mit
der Marke Erg angesprochen werden kann,
• an den darauffolgenden Speicheradressen zwei 3-dimensionale Vektoren
wie folgt anlegen:
• Der erste Vektor soll über V1 ansprechbar sein und mit den 32
Bit-Zahlen [100, 200, 300] initialisert werden;
• der zweite Vektor soll über V2 ansprechbar sein und mit den 32
Bit-Zahlen [10, 20, 30] initialisiert werden.
Erg
V1
V2
LOC
GREG
Data_Segment
@
OCTA
TETRA
TETRA
TETRA
TETRA
TETRA
TETRA
100
200
300
10
20
30
6.4 MMIX-Programme
237
Übersetzungsprozess
Nachfolgende Abbildung zeigt den Übersetzungsprozess, mit dem MMIX-Quelldateien
in MMIX-Objektdateien umgewandelt werden um anschließend vom MMIX-Simulator
ausgeführt werden zu können.
Quelldatei *.mms
A
a
Main
LOC
GREG
OCTA
IS
Data_Segment
@
3
$1
LOC
LDO
ADD
STO
#100
a,A
a,a,8
a,A
Assembler
(Präprozessor)
mmixal *.mms
A
a
Main
LOC
GREG
OCTA
IS
Data_Segment
@
3
$1
LOC
LDO
ADD
STO
#100
$1,$254,0
$1,$1,8
$1,$254,0
Assembler
Binärdatei *.mmo
xxxxxxxxxxxxxxxxxxxxxxxx
xxxxxxxxxxxxxxxxxxxxxxxx
8D01FE0020010108AD01FE00
xxxxxxxxxxxxxxxxxxxxxxxx
Loader-Anweisungen
MMIX-Befehle
Symboltabelle
mmix -i *.mmo
MMIX-Simulator
MMIX-Quelldateien werden mit einem Texteditor erstellt. Die Quelldateien haben die
Endung mms (MMIX source). Mit einem Aufruf des Assemblierungsprogramms mmixal
238
6 MMIX-Prozessor
werden die Quelldateien in Objektdateien übersetzt. Der Assembler verarbeitet zunächst
die Assembler-Anweisungen (z.B. IS-Befehle) mit einem Präprozessor und löst Namen
und Marken auf. Anschließend übersetzt er die MMIX-Befehle (mit den aufgelösten
Marken) in entsprechende Binärwerte. Die durch Namen und Marken gegebenen Anweisungen sind somit implizit in den MMIX-Befehlen enthalten (Nummer des Registers,
Speicheradresse, ...). Aus den Sprung-Marken erstellt der Assembler eine Symboltabelle, in der für jedes vorkommende Symbol die entsprechende Adresse eingetragen wird.
Auf diese Weise kann z.B. der Loader über die Symboltabelle die Adresse der Marke
Main ermitteln und zum Programmstart an diese Adresse verzweigen.
Befehlswort
Das Befehlswort beim MMIX ist für alle Befehle 32 Bit breit, d.h. die Länge des
Befehlsworts (in Byte) ist konstant. Dies ist ein typisches Merkmal für RISC-Prozessoren.
Durch die konstante Befehlswortbreite ist es sehr einfach, Befehle ‘‘im Voraus’’ aus dem
Befehlsspeicher zu laden: Da alle Befehle vier Byte breit sind, können durch Laden der
nächsten 4 · n Byte die nächsten n Befehle aus dem Speicher geladen werden.
Bei CISC-Prozessoren ist die Länge des Befehlsworts nicht konstant sondern abhängig
vom jeweiligen Befehl. Bei x86 sind Befehlsworte beispielsweise zwischen 1 und 15 Byte
lang.
Beim MMIX gliedert sich das 32 Bit breite Befehlswort in vier Byte, die Opcode, X, Y und
Z genannt werden.
31
24 23
OP
16 15
X
8 7
Y
0
Z
• Der Opcode ist eine 8 Bit breite Zahl die festlegt, um welchen Befehl es sich
handelt (Addieren, Subtrahieren, ...). Die Zuordnung Opcode $ Befehl wird
durch eine Tabelle (s.u.) spezifiziert.
• X ist (bis auf Speicherbefehle) der Ziel-Operand, d.h. eine 8 Bit breite Zahl,
die festlegt, in welches Register (0 bis 255 bei Allzweckregistern bzw. 0 bis
31 bei Spezialregistern) das Ergebnis der Operation abgelegt werden soll. Die
Kodierung von X entspricht der Registernummer, d.h. ‘‘Register 1’’ wird als
X = 0000 00012 = 0x01 kodiert.
• Y und Z sind die Quelloperanden, d.h. zwei 8 Bit breite Zahlen, die festlegen,
in welchen Registern die Quelloperanden stehen. Die Kodierung entspricht der
von X.
6.4 MMIX-Programme
239
Spezialregister werden im Befehlswort wie folgt codiert:
x
0x00
0x01
0x02
0x03
0x04
0x05
0x06
0x07
S(x)
rB
rD
rE
rH
rJ
rM
rR
rBB
x
0x08
0x09
0x0A
0x0B
0x0C
0x0D
0x0E
0x0F
S(x)
rC
rN
rO
rS
rI
rT
rTT
rK
x
0x10
0x11
0x12
0x13
0x14
0x15
0x16
0x17
S(x)
rQ
rU
rV
rG
rL
rA
rF
rP
x
0x18
0x19
0x1A
0x1B
0x1C
0x1D
0x1E
0x1F
S(x)
rW
rX
rY
rZ
rWW
rXX
rYY
rZZ
Viele MMIX-Befehle verwenden sog. Direktoperanden (engl. immediate operands), d.h.
Operanden, die direkt im Befehlswort stehen. Beim MMIX sind folgende Direktoperanden
möglich:
• Z: Die Bits 7 ... 0 des Befehlsworts enthalten eine 8 Bit breite Zahl.
• Y: Die Bits 15 ... 8 des Befehlsworts enthalten eine 8 Bit breite Zahl.
• YZ: Die Bits 15 ... 0 des Befehlsworts enthalten eine 16 Bit breite Zahl.
• XYZ: Die Bits 23 ... 0 des Befehlsworts enthalten eine 24 Bit breite Zahl.
240
6 MMIX-Prozessor
Nachfolgende Tabelle übersetzt MMIX-Opcodes in diejenigen Zahlen, die im Befehlswort
!"#"$% &'()*+,-.%(*/%012'(*/%
in! den Bits 31...24 abgelegt werden müssen.
&'(!)*+*,-(#.*-/!01234/*5!67*8434/*9!:;</!=*8>((!7'3,+4-=*7/*<!?'@*--*!A@*<(*BCBD!
!
0x..0
0x0..
0x1..
0x2..
0x3..
0x4..
0x5..
0x6..
0x7..
0x8..
0x9..
0xA..
0xB..
0xC..
0xD..
0xE..
0xF..
0x..1
TRAP 5ν
FCMP ν
FLOT[I] 4ν
FMUL 4ν
FCMPE 4ν
MUL[I] 10ν
ADD[I] ν
2ADDU[I] ν
CMP[I] ν
SL[I] ν
BN[B] ν+π
BNN[B] ν+π
PBN[B] 3ν-π
PBNN[B] 3ν-π
CSN[I] ν
CSNN[I] ν
ZSN[I] ν
ZSNN[I] ν
LDB[I] µ+ν
LDT[I] µ+ν
LDSF[I] µ+ν
LDVTS[I] ν
STB[I] µ+ν
STT[I] µ+ν
STSF[I] µ+ν
SYNCD[I] ν
OR[I] ν
AND[I] ν
BDIF[I] ν
MUX[I] ν
SETH ν
SETMH ν
ORH ν
ORMH ν
JMP[B] ν
POP 3ν
RESUME 5ν
0x..8
0x..9
0x..2
0x..3
0x..4
FUN ν
FEQL ν
FLOTU[I] 4ν
FUNE ν
FEQLE 4ν
MULU[I] 10ν
ADDU[I] ν
4ADDU[I] ν
CMPU[I] ν
SLU[I] ν
BZ[B] ν+π
BNZ[B] ν+π
PBZ[B] 3ν-π
PBNZ[B] 3ν-π
CSZ[I] ν
CSNZ[I] ν
ZSZ[I] ν
ZSNZ[I] ν
LDBU[I] µ+ν
LDTU[I] µ+ν
LDHT[I] µ+ν
PRELD[I] ν
STBU[I] µ+ν
STTU[I] µ+ν
STHT[I] µ+ν
PREST[I] ν
ORN[I] ν
ANDN[I] ν
WDIF[I] ν
SADD[I] ν
SETML ν
SETL ν
ORML ν
ORL ν
PUSHJ[B] ν
[UN]SAVE 20µ+ν
0x..A
0x..B
0x..5
0x..6
0x..7
FADD 4ν
FIX 4ν
FSUB 4ν
FIXU 4ν
SFLOT[I] 4ν
SFLOTU[I] 4ν
FDIV 40ν FSQRT 40ν FREM 4ν
FINT 4ν
DIV[I] 60ν
DIVU[I] 60ν
SUBU[I] ν
SUB[I] ν
8ADDU[I] ν
16ADDU[I] ν
NEG[I] ν
NEGU[I] ν
SR[I] ν
SRU[I]ν
BP[B] ν+π
BOD[B] ν+π
BNP[B] ν+π
BEV[B] ν+π
PBP[B] 3ν-π
PBOD[B] 3ν-π
PBNP[B] 3ν-π
PBEV[B] 3ν-π
CSP[I] ν
CSOD[I] ν
CSNP[I] ν
CSEV[I] ν
ZSP[I] ν
ZSOD[I] ν
ZSNP[I] ν
ZSEV[I] ν
LDW[I] µ+ν
LDWU[I] µ+ν
LDO[I] µ+ν
LDOU[I] µ+ν
CSWAP[I] 2µ+2ν
LDUNC[I] µ+ν
PREGO[I] ν
GO[I] 3ν
STW[I] µ+ν
STWU[I] µ+ν
STO[I] µ+ν
STOU[I] µ+ν
STCO[I] µ+ν
STUNC[I] µ+ν
SYNCID[I] ν
PUSHGO[I] 3ν
NOR[I] ν
XOR[I] ν
NAND[I] ν
NXOR[I] ν
TDIF[I] ν
ODIF[I] ν
MOR[I] ν
MXOR[I] ν
INCH ν
INCHM ν
INCML ν
INCL ν
ANDNH ν
ANDNMH ν ANDNML ν
ANDNL ν
GETA[B] ν
PUT[I] ν
SYNC ν
SWYM ν
GET ν
TRIP 5ν
0x..C
0x..D
0x..E
0x..F
0x0..
0x1..
0x2..
0x3..
0x4..
0x5..
0x6..
0x7..
0x8..
0x9..
0xA..
0xB..
0xC..
0xD..
0xE..
0xF..
!
!
!
&'(!*<(B*!E;@@-*!0F!);B#G*<B9!/*(!1234/*(!*7B(2<;3,B!/*<!&422*-C*;-*!0H!@;(!IJ95!;7!/*<!(;3,!/*<!)*#
+*,-(34/*!@*+;7/*BD!
Die
Übersetzung erfolgt folgendermaßen:
!
! • Befehl suchen
&'(!C:*;B*!E;@@-*!/*(!1234/*(!*<=;@B!(;3,!:;*!+4-=BK!
! • Doppelzeile ermitteln, in der der Befehl steht
−! 6L)!0);B!E<D!"9!/*(!C:*;B*7!E;@@-*(!
! H5!:*77!(;3,!/*<!)*+*,-!;8!4@*<*7!?*;-!/*<!&422*!"#$"
!@*+;7/*B!
• An +der
Seite der Tabelle das obere Nibble (= die
oberen
4 Bits) des Opcodes
+! I5!:*77!(;3,!/*<!)*+*,-!;8!M7B*<*7!?*;-!/*<!&422*-!"#$"!@*+;7/*B!!
! ablesen, z.B. ADD ) 0x2
−! );B(!$5!I!M7/!H!/*(!C:*;B*7!E;@@-*(!*7B(2<*3,*7!/*<! %&'$("!0H!@;(!%95!;7!/*8!(;3,!/*<!)*+*,-(#
• Prüfen,
ob der Befehl im oberen oder im unteren Teil der Doppelzeile steht
34/*!@*+;7/*B!
!
• Steht der Befehl im oberen Teil der Doppelzeile, kann man das untere
[I]!@*/*MB*BK!N88*/;'B*#O'<;'7B*!/*(!)*+*,-(!
Nibble ⇔
(=!&;<*PB42*<'7/!
die unteren 4 Bits) des Opcodes an der ersten Tabellenzeile
−! ;88*/;'B*!
−! ADD $1,$2,$3K!7;3,B!;88*/;'B*5!/'!/*<!"D!12*<'7/!*;7!Q*=;(B*<!;(B!M7/!P*;7*!R',-!
ablesen, z.B. ADD ) 0x..0 oder 0x..1
−! ADD $1,$2,3K!;88*/;'B*5!/'!'-(!"D!12*<'7/!*;7*!R',-!'7=*=*@*7!;(B!M7/!P*;7!Q*=;(B*<!
−! /*<!
1234/*!
;88*/;'B*#O'<;'7B*!
*;7*(!der
)*+*,-(!
;(B! ;88*<! kann
M8! I! man
,S,*<!das
'-(! /;*! 7;3,B#
• Steht
der/*<!
Befehl
im unteren Teil
Doppelzeile,
;88*/;'B*#O'<;'7B*!/*(!)*+*,-(!0(B*,B!;7!/*<!&422*-)&'$("!'-(4!<*3,B(9!
−! *;7*! ;88*/;'B*#O'<;'7B*! /*(! )*+*,-(!:;</! T48! U((*8@-*<!'MB48'B;(3,! '7,'7/! /*(! +*,-*7/*7!
&4--'<#R*;3,*7(! 0$9! *<P'77B5! :*(,'-@! ;8! V<4=<'88! 7;3,B! *W2-;C;B! ADDI! =*(3,<;*@*7! :*</*7!
8M((!!!
!
"#$%
6.4 MMIX-Programme
241
untere Nibble (=die unteren 4 Bits) des Opcodes an der untersten
Tabellenzeile ablesen, z.B. 2ADDU ) 0x..8 oder 0x..9
• Anschließend muss nur noch unterschieden werden, ob es sich um die linke
oder die rechte Variante des Befehls handelt, beispielsweise ob man in der
oberen Zeile 0x..0 oder 0x..1 auswählen muss oder ob man in der unteren
Zeile 0x..8 oder 0x..9 auswählen muss. Dazu wird der in der Tabelle nach dem
Befehlsnamen in Klammern stehende Buchstabe verwendet;
• I bedeutet immediate, d.h. Direktoperand; Beispiel: Bei ADD $1,$2,$3
wird ADD mit 0x20 codiert, bei ADD $1,$2,3 mit 0x21
• B bedeutet backward, d.h. Rückwärtssprung; erhöht sich bei einem
Sprung die Adresse, wird der linke Zahlenwert verwendet (VorwärtsSprung); verringert sich bei einem Sprung die Adresse, wird der rechte
Zahlenwert verwendet (Rückwerts-Sprung)
Aus der Tabelle lassen sich auch die von Donald Knuth für den MMIX-Simulator
spezifizierten Ausführungszeiten ermitteln:
• ⌫ entspricht der Dauer von 1 Takt
• µ ist die Anzahl der Takte für einen Speicherzugriff
• ⇡ bedeutet
• 3 · ⌫, wenn gesprungen wird, und
• 0 · ⌫, wenn nicht gesprungen wird.
242
6 MMIX-Prozessor
Aufgaben
T
a)
Wie breit (in Bit) ist das MMIX Befehlswort?
32 Bit
T
b) Skizzieren Sie das MMIX Befehlswort und geben Sie den Inhalt jedes Bytes an.
31
24
Opcode
T
c)
23
16
1. Operand = X
15
2. Operand = Y
8
7
0
3. Operand = Z
In welchen Byte des Befehlsworts wird im Allgemeinen Information über die
Quelloperanden bzw. über die Zieloperanden abgespeichert?
Ziel = X; Quelle = Y, Z.
T
d) Was ist ein Direktoperand?
Ein Direktoperand ist ein Operand der direkt im Befehlswort steht.
e)
Wieviele Taktzyklen benötigen die meisten Befehlen zur Ausführung?
Die meisten Befehle können innerhalb von 1 ⌫, d.h. innerhalb eines Taktes ausgeführt werden.
f)
Welcher Befehl benötigt die längste Zeit zur Ausführung, wenn man von Speicherbefehlen absieht?
Der Befehl DIV (Division von Festkommazahlen).
g) Wieviele Takte benötigt der BZ-Befehl, wenn gesprungen wird?
⌫ + ⇡ = ⌫ + 2⌫ = 3⌫ ) 3 Takte
6.4 MMIX-Programme
h)
Wieviele Takte benötigt der BZ-Befehl, wenn nicht gesprungen wird?
⌫ + ⇡ = ⌫ + 0⌫ = 1⌫ ) 1 Takt
i)
Wieviele Takte benötigt der PBZ-Befehl, wenn gesprungen wird?
3⌫
j)
2⌫ = 1⌫ ) 1 Takt
Wieviele Takte benötigt der PBZ-Befehl, wenn nicht gesprungen wird?
3⌫
k)
⇡ = 3⌫
⇡ = 3⌫
0⌫ = 3⌫ ) 3 Takte
Geben Sie das 32 Bit breite Befehlswort des Befehls ‘‘SL $1,$2,3’’ an.
0x39010203
T
l)
Geben Sie das 32 Bit breite Befehlswort des Befehls ‘‘SUB $5,$6,7’’ an.
0x25050607
243
244
6 MMIX-Prozessor
6.5 MMIX Befehle
Definitionen
Wort
w b ist ein Wort der Länge b Byte. wxb repräsentiert Bit Nr. x im Datenwort w b , wobei das
b
niederwertigste Bit in w b an Bitposition x = 0 liegt. wx...y
meint Bits x...y des Datenworts
b
w .
Befehlswort
Sei ◆ ein 32 Bit breites MMIX Befehlswort.
• X = ◆23...16
• Y = ◆15...8
• Z = ◆7...0
• YZ = ◆15...0
• XY = ◆23...8
• XYZ = ◆23...0
Allzweckregister
• Der MMIX-Prozessor verfügt über 256 Allzweckregister, die mit 0, 1, ... 255
durchnummeriert werden.
• Zur Adressierung eines Allzweckregisters im Befehlswort wird die als vorzeichenlose 8 Bit breite Zahl codierte Registernummer verwendet. Beispiel:
Register 5 wird als 0x05 bzw. als Bitkombination 00000101 codiert.
• $x, 0  x  255 entspricht der Bitkombination, die in Register x gespeichert ist.
• $X ist die Bitkombination, die in dem durch Bits 23...16 des Befehlsworts
adressierten Register gespeichert ist. Beispiel: Befehlswort ist 0x12345678;
Bits 23...16 extrahieren ) 0x34 (= Bitkombination 00110100) = Dezimal 52 )
Im Falle des Befehlsworts 0x12345678 meint $X den Wert, der in Register 52
gespeichert ist.
• $Y ist die Bitkombination, die in dem durch Bits 15...8 des Befehlsworts
adressierten Register gespeichert ist.
• $Z ist die Bitkombination, die in dem durch Bits 7...0 des Befehlsworts adressierten Register gespeichert ist.
6.5 MMIX Befehle
245
Arbeitsspeicher
M ist der Arbeitsspeicher des MMIX Prozessors (M = memory).
• M1 [x] ist das an Adresse x gespeicherte Byte.
• M2 [x] ist das an Adresse x & ( 2) gespeicherte Wyde.
• M4 [x] ist das an Adresse x & ( 4) gespeicherte Tetra.
• M8 [x] ist das an Adresse x & ( 8) gespeicherte Octa.
Die Symbole ◆, X, Y, Z, $X, $Y, $Z, $0, $1, ..., M1 [...], M2 [...], ... repräsentieren Bitmuster.
Ein Zahlenwert entsteht erst durch entsprechende Interpretation des Bitmusters (z.B.
vorzeichenlose Festkommazahl, ...).
Befehlszähler
Beim MMIX bedeutet das Zeichen @ ‘‘the place where we are at’’ und meint eine Adresse
im Speicher.
• Beim Loader bezieht sich @ auf die Adresse, an der ein Daten- oder Befehlsworte im Speicher abgelegt werden soll.
• In Bezug auf die Befehlsausführung meint @ die Adresse des Befehls, der
gerade ausgeführt wird, also den Befehlszähler BZ (oder PC für engl. program
counter).
246
6 MMIX-Prozessor
Operationen
•x
y : Weise x den Wert y zu
• x , y : Ausdruck x ist äquivalent zum Ausdruck y
• x ) y : Wenn x, dann y
• x||y : Logische operation x ODER y
• x = y : Vergleich ob x den gleichen Wert hat wie y ; liefert wahr (d.h. 1), wenn x
den selben Wert hat wie y , sonst falsch (d.h. 0)
• x ⌧ y : Schiebe x um y Stellen nach links; fülle frei werdende Bitstellen mit 0
auf
• x u y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen
mit 0 auf
• x s y : Schiebe x um y Bitstellen nach rechts; fülle frei werdende Bitstellen mit
dem Wert des Vorzeichenbits (MSB) auf.
• x % y : Rest der Festkomma-Division x/y .
• ⇠ x: Invertiere alle Bits von x, d.h. berechne das 1er-Komplement
• x & y : Bitweise UND-Verknüpfung von x und y
• x | y : Bitweise ODER-Verknüpfung von x und y
• x ⌦ y : Bitweise XOR-Verknüpfung von x und y
Umwandlung Festkommazahl $ Gleitkommazahl
• f32 (w 4 ): Nimmt an, dass das vier Byte breite Datenwort w 4 im 32 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
0 (x): Codiert die Zahl x als 32 Bit breite Gleitkommazahl und gibt das
• f32
entsprechende 32 Bit breite Bitmuster zurück.
• f64 (w 8 ): Nimmt an, dass das acht Byte breite Datenwort w 8 im 64 Bit IEEE 754
Gleitkommaformat codiert ist und gibt den entsprechenden Zahlenwert zurück
(z.B. 1,75).
0 (x): Codiert die Zahl x als 64 Bit breite Gleitkommazahl und gibt das
• f64
entsprechende 64 Bit breite Bitmuster zurück.
• r (x): Rundet eine reelle Zahl gemäß dem in Register rA ausgewählten Rundungsmodus auf eine ganze Zahl.
6.5 MMIX Befehle
247
(De-) Codierung von Festkommazahlen
• s(w b ): Nimmt an, dass das b Byte breite Wort w b im 2er-Komplement codiert
ist und gibt den entsprechenden Wert zurück (z.B. 1, 0, -3)
• u(w b ): Nimmt an, dass das b Byte breite Wort w b als vorzeichenlose Festkommazahl codiert ist und gibt den entsprechenden Wert zurück (z.B. 0, 1)
• sb0 (x): Gibt das b Bit breite im 2er-Komplement codiert Bitmuster zurück das
dem Wert x entspricht.
• ub0 (x): Gibt das b Bit breite Bitmuster (vorzeichenlose Codierung) zurück das
dem Wert x, x 0, entspricht.
Zusammenfassen von in Registern gespeicherten Werten
Wenn $X das 64 Bit breite in Register X gespeicherte Bitmuster ist und $Y das 64 Bit breite
in Register Y gespeicherte Bitmuster ist, dann ist $X$Y das 128 Bit breite Bitmuster das
aus der Aneinanderreihung der beiden Bitmuster $X und $Y entsteht. ($X$Y)127...64 = $X
und ($X$Y)63...0 = $Y.
Programm beenden
• TRAP 0,Halt,0 beendet ein MMIX-Programm und gibt die Kontrolle zurück an
das Betriebssystem.
Register-Register-Befehle
Hardware
Der MMIX ist eine Drei-Address- Register-Register-Maschine, d.h. er verarbeitet bis
zu zwei individuell spezifizierbare Quell-Operanden zu einem Zieloperand, wobei alle
Operanden in Registern stehen.
Auf die durch Y und Z adressierten Operanden wird beim MMIX nur lesend zugegriffen.
Auf X wird sowohl lesend als auch schreibend zugegriffen.
248
a)
6 MMIX-Prozessor
Vervollständigen Sie nachfolgende Schaltung des Registerblocks (engl. register
file so, dass
• an den Ausgängen $X, $Y und $Z die durch X, Y und Z spezifizierten
Register automatisch ausgegeben werden und
• das am Eingang $X anliegende Datenwort im Falle einer positiven Flanke
am clk-Eingang in das durch X spezifizierte Register übernommen wird.
clk
64
255
64
1 0
0
1
64
64
$X
64
64
$0
64
64
$X
255
8
64
64
X
0
1
64
8
64
$1
64
64
64
$Y
255
8
Y
8
64
64
0
1
64
64
Z
8
64
$255
64
64
255
8
$Z
6.5 MMIX Befehle
T
249
b) Vervollständigen Sie nachfolgende Schaltung des Rechenwerks (= ALU = Arithmetic Logic Unit) so, dass mit der Steuerleitung op (operation) die Ergebnisse der
verschiedenen integrierten Hardware-Schaltungen an den Ausgang durchgeschaltet werden können.
op
a
64
a >>u b
b
0
ADD
1
a
a << b
FADD
b
2
3
a
SUB a-b
4
b
a
a
a >>s b
FSUB a-b
b
b
MUL
5
6
7
8
a
a|b
b
64
64
250
c)
6 MMIX-Prozessor
Entwickeln Sie einen MMIX-Prozessor, der Register-Register-Befehle mit 8 Bit
vorzeichenlosen Direktoperanden Z ausführen kann sowie vorzeichenlose 16 Bit
Direktoperanden YZ in Register X ablegen kann.
Steuerung
4
Add
64
BZ
31…24
8
64
AllzweckRegisterblock
15…0 16
Adresse
0
BefehlsSpeicher
Daten
BR
0
64
1
$X
$X
X
$Y
64
48
23…16
8
15…8
8
32
7…0
8
0
56
64
Y
Z
$Z
64
64
0
ALU
1
Arithmetische Befehle auf Festkommazahlen
Befehl Operanden
$X,$Y,$Z
ADD
$X,$Y,Z
ADDU
$X,$Y,$Z
$X,$Y,Z
Name/Aktion
Definition
0 (s($Y) + s($Z))
$X
s64
(s($Y) + s($Z) < 263 ) ||
Add; signed, with overflow
(s($Y) + s($Z) 263 ) )
0 (26 )
rA
rA|u64
0 (s($Y) + u(Z))
$X
s64
(s($Y) + u(Z) < 263 ) ||
Add immediate; signed, with overflow
(s($Y) + u(Z) 263 ) )
0 (26 )
rA
rA|u64
Add unsigned; no overflow
Add unsigned; no overflow
$X
$X
0 (u($Y) + u($Z))
u64
0 (u($Y) + u(Z))
u64
6.5 MMIX Befehle
251
$X,$Y,$Z
Subtract; signed, with overflow
$X,$Y,Z
Subtract immed.; signed, with ovf.
$X,$Y,$Z
$X,$Y,Z
Subtract uns.; no ovf.
Subtract uns. immed.; no ovf.
SUB
SUBU
$X,Y,$Z
Negate; signed, with overflow
$X,Y,Z
Negate immediate; signed
$X,Y,$Z
$X,Y,Z
Negate unsigned; no overflow
Negate unsigned immedidate
NEG
NEGU
$X,$Y,$Z
Multiply; signed, with overflow
$X,$Y,Z
Multiply immed.; signed, with ovf.
$X,$Y,$Z
$X,$Y,Z
Mult. uns.; 128 bit result
Mult. uns. imm.; 128 bit result
MUL
MULU
$X,$Y,$Z
DIV
$X,$Y,Z
Divide; signed
(case $Z 6= 0)
Divide signed
(case $Z = 0)
Divide immediate; signed
(case Z 6= 0)
Divide immediate; signed
(case Z = 0)
0 (s($Y)
$X
s64
s($Z))
(s($Y) s($Z) < 263 ) ||
(s($Y) s($Z) 263 ) )
0 (26 )
rA
rA|u64
0 (s($Y)
$X
s64
u(Z))
63
(s($Y) u(Z) < 2 ) ||
(s($Y) u(Z) 263 ) )
0 (26 )
rA
rA|u64
$X
$X
0 (u($Y)
u64
u($Z))
0
u64 (u($Y) u(Z))
0 (u(Y)
$X
s64
s($Z))
u(Y) s($Z) 263 )
0 (26 )
rA
rA|u64
$X
$X
$X
0 (u(Y)
s64
u(Z))
0 (u(Y)
s64
s($Z))
0
s64 (u(Y) u(Z))
0 (s($Y) · s($Z))
$X
s64
(s($Y) · s($Z) < 263 ) ||
(s($Y) · s($Z) 263 ) )
0 (26 )
rA
rA|u64
0 (s($Y) · u(Z))
$X
s64
(s($Y) · s($Z) < 263 ) ||
(s($Y) · s($Z) 263 ) )
0 (26 )
rA
rA|u64
rH$X
rH$X
0 (u($Y) · u($Z))
u128
0 (u($Y) · u(Z))
u128
0 (bs($Y)/s($Z)c)
s64
0 ( s($Y) % s($Z) )
s64
0 (0)
$X
u64
rR
$Y
0
$X
s64 (bs($Y)/s(Z)c)
0 ( s($Y) % u(Z) )
rR
s64
0 (0)
$X
u64
rR
$Y
$X
rR
252
6 MMIX-Prozessor
$X,$Y,$Z
DIVU
$X,$Y,Z
Divide uns.; 128 bit
case u($Z) > u(rD)
Divide uns.; 128 bit dividend
no ovf.; case u($Z)  u(rD)
Divide uns. immed.; 128 bit
no overflow; case u(Z) > u(rD)
Divide uns. immed.; 128 bit
no ovf.; case u(Z)  u(rD)
0 ( bu(rD$Y)/u($Z)c )
u64
0 ( u(rD$Y) % u($Z) )
u64
$X
rD
rR
$Y
0
$X
u64 ( bu(rD$Y)/u(Z)c )
0 ( u(rD$Y) % u(Z) )
rR
u64
$X
rD
rR
$Y
$X
rR
Direktoperand in Register schreiben
Befehl Operanden Name/Aktion
SETL
$X,YZ
Definition
$X
Set to low wyde
0 (u(YZ))
u64
Der Assembler akzeptiert statt SETL auch SET, um Direktoperanden in ein Register zu
laden. Wird SET mit einem Register als zweiter Operand aufgerufen, wird der Befehl SET
$X,$Y in den Befehl OR $X,$Y,0 übersetzt.
T
a)
In welchem Wertebereich können die Direktoperanden bei den Arithmetischen
Befehlen liegen?
0 ... 255 sowohl für vorzeichenlose als auch für vorzeichenbehaftete Operationen.
T
b) Kann mit dem ADD Befehl 3 + 5 in einer einzigen Codezeile berechnet werden?
Nein, da der ADD-Befehl nur einen Direktoperanden unterstützt, muss der zweite
Operand zuvor in ein Allzweckregister geladen werden.
T
c)
Wie kann man 5
3 in einer einzigen Codezeile berechnen?
NEG
$0,5,3
6.5 MMIX Befehle
T
253
d) Was ist der Unterschied zwischen den Befehlen MUL und MULU?
• MUL: Quell- und Zieloperanden haben jeweils 64 Bit
• MULU: Die Quelloperanden haben jeweils 64 Bit, der Zieloperand hat 128
Bit. Die oberen 64 Bit des Ergebnisses werden im Spezialregister rH
abgelegt.
T
e)
Geben Sie die MMIX-Befehle an, mit denen Sie x = a2 + 2 · a · b + b 2 mit Festkommazahlen berechnen. Nehmen Sie an, dass die Register a, b, und c bereits
initialiert wurden und das Ergebnis in Register x gespeichert werden soll. Benutzen
Sie Register buf1, buf2, ... für Zwischenergebnisse, falls notwendig.
MUL
MUL
MUL
ADD
MUL
ADD
buf1,a,a
buf2,a,2
buf2,buf2,b
buf1,buf1,buf2
buf2,b,b
x,buf1,buf2
buf1
a2
buf2
2·a
buf2
2·a·b
buf1
a2 + 2ab
buf2
b2
x
a2 + 2ab + b 2
254
6 MMIX-Prozessor
Gegeben ist der folgende Programmcode:
a
b
c
d
buf1
buf2
Main
f)
IS
IS
IS
IS
IS
IS
$0
$1
$2
$3
$4
$5
LOC
SETL
SETL
SETL
#100
b,1
c,2
d,3
Geben Sie MMIX-Befehle an, mit denen Sie a =
berechnen.
MUL
SUB
ADD
ADD
DIV
buf1,c,d
buf1,buf1,b
buf2,b,c
buf2,buf2,d
a,buf1,buf2
c·d b
b+c+d
mit Festkommazahlen
6.5 MMIX Befehle
255
Umwandlung Gleitkommazahl $ Festkommazahl
Befehl Operanden Name/Aktion
Definition
FLOT
$X,$Z
$X,Z
Convert fixed to floating
Conv. fixed to float. imm.
$X
$X
0 ( s($Z) )
f64
0 ( u(Z) )
f64
FLOTU
$X,$Z
$X,Z
Conv. uns. fixed to floating
Conv. uns. fixed to float.
imm.
$X
$X
0 ( u($Z) )
f64
0 ( u(Z) )
f64
FIX
$X,$Z
Convert floating to fixed
with overflow
FIXU
$X,$Z
Convert floating to fixed
without overflow
a)
0 ( r ( f ($Z) ) )
$X
s64
64
0 (25 )
f64 ($Z) < 263 ) rA
rA|u64
0 (25 )
f64 ($Z) > 263 1 ) rA
rA|u64
$X
0 ( r ( f ($Z) ) )
s64
64
Welche Aktion führt der Operator r () aus?
r () rundet eine Gleitkommazahl in eine Festkommazahl. Das Runden erfolgt wie in
Spezialregister rA eingestellt.
b) Geben Sie den Befehl an, mit dem Sie Register 0 die Gleitkommazahl 15,0
zuweisen.
FLOT
c)
$0,15
Geben Sie den Befehl an, mit dem Sie eine Gleitkommazahl in Register 1 in eine
Festkommazahl umwandeln.
FIX
$1,$1
256
6 MMIX-Prozessor
Arithmetische Befehle auf Gleitkommazahlen
Befehl Operanden Name/Aktion
Definition
FADD
$X,$Y,$Z
Floating point add
$X
0 ( f ($Y) + f ($Z) )
f64
64
64
FSUB
$X,$Y,$Z
Floating point subtract
$X
0 ( f ($Y)
f64
64
FMUL
$X,$Y,$Z
Floating point multiplication
$X
FDIV
$X,$Y,$Z
Floating point divide
$X
FSQRT
$X,$Z
Square root
a)
f64 ($Z) )
0 ( f ($Y) · f ($Z) )
f64
64
64
0 ( f ($Y)/f ($Z) )
f64
64
64
p
0 (
$X
f64
f64 ($Z) )
Geben Sie MMIX-Befehle an, die ⇡ = 3.1415 in Register a ablegen.
SETL
FLOT
SET
FLOT
FDIV
a,31415
a,a
buf,10000
buf,buf
a,a,buf
b) Geben Sie MMIX-Befehle an, mit denen Sie x = a2 + 2 · a · b + b 2 mit GleitkommaOperationen berechnen. Nehmen Sie an, dass Register a und b mit Festkommazahlen initialisiert wurden und zunächst in Gleitkommazahlen umgewandelt werden
müssen. Speichern Sie das Ergebnis als Gleitkommazahl in Register x. Benutzen
Sie buf1, buf2, ... als Pufferregister.
FLOT
FLOT
FMUL
FLOT
FMUL
FMUL
FADD
FMUL
FADD
a,a
b,b
buf1,a,a
buf2,2
buf2,a,buf2
buf2,buf2,b
buf1,buf1,buf2
buf2,b,b
x,buf1,buf2
buf1
a2
buf2
2·a
buf2
2·a·b
buf1
a2 + 2ab
buf2
b2
x
a2 + 2ab + b 2
6.5 MMIX Befehle
T
c)
257
Geben Sie MMIX-Befehle an, die e = 2,718281828 in Register b ablegen.
SETL
SETL
buf1,10000
a,27
MUL
SETL
ADD
a,a,buf1
buf2,1828
a,a,buf2
MUL
ADD
a,a,buf1
a,a,buf2
FLOT
FLOT
a,a
buf1,buf1
FDIV
FDIV
FLOT
FDIV
a,a,buf1
a,a,buf1
buf1,10
a,a,buf1
258
6 MMIX-Prozessor
Schiebe-Befehle
Befehl Operanden Name/Aktion
Definition
0 ( u($Y ⌧ u($Z)) )
u64
u($Y) · 2u($Z) 264 )
0 (25 )
rA
rA|u64
0 ( u($Y ⌧ u(Z)) )
$X
u64
u($Y) · 2u(Z) 264 )
0 (25 )
rA
rA|u64
$X
$X,$Y,$Z
Shift left; with overflow
$X,$Y,Z
Shift left immediate; with ovf.
SLU
$X,$Y,$Z
$X,$Y,Z
Shift left uns., no overflow
Shift left uns. immed.; no ovf.
$X,$Y,$Z
$X,$Y,Z
Shift right; fill with sign
Shift right imm.; fill with sign
$X
$X
$Y
$Y
s
SR
$X,$Y,$Z
$X,$Y,Z
Shift right unsigned; fill with 0
Shift right uns. imm.; fill w. 0
$X
$X
$Y
$Y
u
SRU
SL
$X
$X
0 ( u($Y ⌧ u($Z)) )
u64
0 ( u($Y ⌧ u(Z)) )
u64
u($Z)
u(Z)
s
u($Z)
u(Z)
u
6.5 MMIX Befehle
a)
259
Wie unterscheiden sich der SR und der SRU Befehl?
• SR: Freiwerdende Bit-Positionen werden mit dem Vorzeichen (Bit 63)
aufgefüllt
• SRU: Freiwerdende Bit-Positionen werden mit 0 aufgefüllt
b) In Register fpn ist eine 64 Bit Gleitkommazahl abgelegt.
63
Inhalt Register fpn:
s
62
52
e
51
0
f
Geben Sie die MMIX-Befehle an, mit denen Sie s, e und f aus Register fpn
extrahieren und in Register s, e und f ablegen.
SRU
s,fpn,63
s
SLU
SRU
e,fpn,1
e,e,53
e
SLU
SRU
f,fpn,63-51
f,f,63-51
260
6 MMIX-Prozessor
Logische Operationen auf Bit-Ebene
Befehl Operanden Name/Aktion
Definition
AND
$X,$Y,$Z
$X,$Y,Z
Bitwise AND
Bitwise AND immediate
ANDN
$X,$Y,$Z
$X,$Y,Z
Bitwise AND NOT
Bitww AND NOT immed.
ANDNL
$X,YZ
Bitw. AND NOT low wyde
ANDNML $X,YZ
Bw. AND NOT med. l. wd.
$X
0 ( u(YZ) ) ⌧ 16)
$X & ⇠ ( u64
ANDNMH $X,YZ
Bw. AND NOT med. h. wd.
$X
0 ( u(YZ) ) ⌧ 32)
$X & ⇠ ( u64
ANDNH
$X,YZ
Bw. AND NOT high wyde
$X
0 ( u(YZ) ) ⌧ 48)
$X & ⇠ ( u64
NAND
$X,$Y,$Z
$X,$Y,Z
Bitwise NOT AND
Bitwise NOT AND immed.
OR
$X,$Y,$Z
$X,$Y,Z
Bitwise OR
Bitwise OR immediate
ORL
$X,YZ
Bitwise OR low wyde
ORML
$X,YZ
Bitw. OR med. low wyde
$X
0 ( u(YZ) ) ⌧ 16)
$X | ( u64
ORMH
$X,YZ
Bitw. OR med. high wyde
$X
0 ( u(YZ) ) ⌧ 32)
$X | ( u64
ORH
$X,YZ
Bitwise OR high wyde
$X
0 ( u(YZ) ) ⌧ 48)
$X | ( u64
ORN
$X,$Y,$Z
$X,$Y,Z
Bitwise OR NOT
Bitwise OR NOT immediate
NOR
$X,$Y,$Z
$X,$Y,Z
Bitwise NOT OR
Bitwise NOT OR immediate
XOR
$X,$Y,$Z
$X,$Y,Z
Bitwise XOR
Bitwise XOR immediate
NXOR
$X,$Y,$Z
$X,$Y,Z
Bitwise NOT XOR
Bitw. NOT XOR immediate
$X
$X
$Y & ⇠ $Z
0 ( u(Z) )
$Y & ⇠ u64
$X
0 ( u(YZ) )
$X & ⇠ u64
$X
$X
⇠ ($Y & $Z)
0 ( u(Z) ) )
⇠ ( $Y & u64
$X
$X
$X
$Y | ⇠ $Z
0 ( u(Z) )
$Y | ⇠ u64
$X
$X
$X
$Y | $Z
0 ( u(Z) )
$Y | u64
0 ( u(YZ) )
$X | u64
$X
$X
⇠ ($Y | $Z)
0 ( u(Z) ) )
⇠ ($Y | u64
$X
$X
$X
$Y & $Z
0
$Y & u64 ( u(Z) )
$X
$Y ⌦ $Z
0
$Y ⌦ u64 ( u(Z) )
$X
⇠ ($Y ⌦ $Z)
0 ( u(Z) ) )
⇠ ($Y ⌦ u64
6.5 MMIX Befehle
261
Bits löschen
a)
Welche Befehle verwendet man typischerweise um einzelne Bits zu löschen?
Befehle, die UND-Operationen implementieren.
b) Geben Sie an, wie Sie mit dem Befehl ANDNML Bit 21 in Register a löschen.
ANDNML
T
c)
a,#20
Geben Sie an, wie Sie mit dem Befehl ANDN Bit 21 in Register a löschen.
SETL
SLU
ANDN
$1,1
$1,$1,21
a,a,$1
d) Geben Sie an, wie Sie mit einem NAND und einem AND-Befehl Bit Nr. 21 löschen.
SETL
SL
NAND
AND
b,1
b,b,21
b,b,b
a,a,b
Bits setzen
a)
Welche Befehle verwendet man typischerweise um Bits zu setzen?
ODER-Befehle
262
6 MMIX-Prozessor
b) Geben Sie die Befehle, mit denen Sie in Register a Bit 20 mit einem OR-Befehl auf
1 setzen.
SETL
SLU
OR
T
$1,1
$1,$1,20
a,a,$1
Geben Sie an, wie Sie in Register a Bit 20 mit einem ORML-Befehl auf 1 setzen.
c)
ORML
a,#10
XOR
a)
Erklären Sie den Effekt einer XOR-Operation.
XOR-Operationen setzen das Ziel-Bit auf 1, wenn die beiden Quell-Bits unterschiedlich sind.
b) Was wird dem Ziel-Operanden einer XOR-Operation zugewiesen, wenn alle Bits
des einen Quell-Operanden gelöscht (0) sind?
Dem Ziel-Operanden werden die Bits des anderen Quell-Operanden zugewiesen.
c)
Was wird dem Ziel-Operanden einer XOR-Operation zugewiesen, wenn alle Bits
des einen Quell-Operanden gesetzt (1) sind?
Dem Ziel-Operanden werden die invertierten Bits des anderen Quell-Operanden
zugewiesen.
d) Geben Sie die Befehle an, mit denen Sie alle Bits in Register a invertieren.
NEG
XOR
b,0,1
a,a,b
6.5 MMIX Befehle
263
Register-Speicher-Befehle
Der MMIX ist eine Load-Store-Architektur. Speicherzugriffe erfolgen damit nicht implizit,
sondern müssen explizit durch eigene Lade- und Speicherbefehle durchgeführt werden.
Da das Befehlswort des MMIX nur 32 Bit breit ist, kann es keine Speicheradressen
aufnehmen. Beim MMIX wird dieses Problem dadurch gelöst, dass bei Lade- und
Speicherbefehlen das durch das Befehlswort spezifizierte Y-Register eine Basisadresse
enthält und Z bzw. $Z einen Offset festlegt, der auf zur Basisadresse addiert wird. Das
Additionsergebnis ist 64 Bit breit und wird als Adresse verwendet.
a)
Erweitern Sie nachfolgende Prozessor-Schaltung um die Fähigkeit, Lade- und
Speicherzugriffe durchzuführen.
Steuerung
4
Add
0
64
BZ
31…24
8
64
15…0 16
Adresse
0
BefehlsSpeicher
Daten
BR
1
AllzweckRegisterblock
0
64
1
$X
$X
clk
DatenEingang
64
DatenSpeicher
48
23…16
8
15…8
8
32
7…0
8
0
56
X
$Y
64
DatenAusgang
Y
Z
$Z
64
64
ZugriffsArt
0
1
ALU
Adresse
264
6 MMIX-Prozessor
Daten vom Speicher in ein Register laden
Befehl Operanden Name/Aktion
Definition
0 (s(M [u($Y) + u($Z)]))
s64
1
0 (s(M [u($Y) + u(Z)]))
s64
1
LDB
$X,$Y,$Z
$X,$Y,Z
Load byte
Load byte immediate
$X
$X
LDBU
$X,$Y,$Z
$X,$Y,Z
Load byte unsigned
Load byte uns. immed.
$X
$X
LDW
$X,$Y,$Z
$X,$Y,Z
Load wyde
Load wyde immediate
$X
$X
LDWU
$X,$Y,$Z
$X,$Y,Z
Load wyde unsigned
Load wyde uns. immed.
$X
$X
LDT
$X,$Y,$Z
$X,$Y,Z
Load tetra
Load tetra immediate
$X
$X
LDTU
$X,$Y,$Z
$X,$Y,Z
Load tetra unsigned
Load tetra uns. immed.
$X
$X
LDO
$X,$Y,$Z
$X,$Y,Z
Load octa
Load octa immediate
$X
$X
M8 [u($Y) + u($Z)]
M8 [u($Y) + u(Z)]
LDOU
$X,$Y,$Z
$X,$Y,Z
Load octa unsigned
Load octa uns. immed.
$X
$X
M8 [u($Y) + u($Z)]
M8 [u($Y) + u(Z)]
0 (u(M [u($Y) + u($Z)]))
u64
1
0
u64 (u(M1 [u($Y) + u(Z)]))
0 (s(M [u($Y) + u($Z)]))
s64
2
0 (s(M [u($Y) + u(Z)]))
s64
2
0 (u(M [u($Y) + u($Z)]))
u64
2
0
u64 (u(M2 [u($Y) + u(Z)]))
0 (s(M [u($Y) + u($Z)]))
s64
4
0 (s(M [u($Y) + u(Z)]))
s64
4
0 (u(M [u($Y) + u($Z)]))
u64
4
0
u64 (u(M4 [u($Y) + u(Z)]))