TU Wien:Technische Grundlagen der Informatik VU (Kastner)/Kapitel Micro16

Aus VoWi
Zur Navigation springen Zur Suche springen

Seite um Informationen über und Code für den Micro16-Simulator zu sammeln. Der Simulator wurde vom TGI-Team entwickelt, ist in Java geschrieben und auf TUWEL verfügbar.

Komponenten[Bearbeiten | Quelltext bearbeiten]

Arithmetic Logic Unit[Bearbeiten | Quelltext bearbeiten]

ALU Beschreibung Syntax
00 A-Bus unverändert durchschalten A
01 Addition A + B
10 Und-Verknüpfung A & B
11 negiert A-Bus ~A

Rechnet im Zweierkomplement mit 16 Bit breiten Datenwörtern aus Registern. Das Ergebnis geht durch den #Shifter.

Ausgänge für #Micro Sequencing Logic:

  • N: Ergebnis ist negativ (MSB=1)
  • Z: Ergebnis ist zero

Shifter[Bearbeiten | Quelltext bearbeiten]

SH Beschreibung Syntax
00 keine Veränderung X
01 left shift lsh(X)
10 right shift rsh(X)
11 ungültig

Micro Sequencing Logic[Bearbeiten | Quelltext bearbeiten]

COND Beschreibung Syntax
00 kein Sprung
01 Sprung, wenn N=1 if N goto addr
10 Sprung, wenn Z=1 if Z goto addr
11 unbedingter Sprung goto addr

Register File[Bearbeiten | Quelltext bearbeiten]

0 1 -1 PC R0-R10 AC

16 Register, die je 16 Bit breit sind. Die ersten drei sind nicht schreibbar.

Micro Instruction Register[Bearbeiten | Quelltext bearbeiten]

Ein Codewort ist 32 bit groß.

Feld Beschreibung Syntax
AMUX Ob das Memory Buffer Register als A-Eingang der ALU verwendet wird. … <- MBR
COND Sprungbedingung für die #Micro Sequencing Logic (2 bit) [if N/Z] goto addr
ALU Operation für die #Arithmetic Logic Unit (2 bit) A, A+B, A&B, ~A
SH Operation für den #Shifter (2 bit) X, lsh(X), rsh(X)
MBR Ob der S-Bus in das Memory Buffer Register geschrieben wird. MBR <- …
MAR Ob der B-Bus in das Memory Address Register geschrieben wird. MAR <- R
RD/WR Wenn MS (memory select) gesetzt ist, wird bei RD/WR=0 geschrieben und bei RD/WR=1 gelesen. Läuft über 2 Takte. rd, wr
MS
ENS Wenn ENS gesetzt ist, wird der S-Bus in das durch S-Bus gegebene Register geschrieben. (4 bit) R <- …
S-Bus
B-Bus Welches Register für den B-Bus ausgewählt wird. (4 bit) A+B, A&B
A-Bus Welches Register für den A-Bus ausgewählt wird. (4 bit) A, ~A
ADDR Sprungziel für Micro Instruction Counter, wenn COND erfüllt ist. (8 bit) goto addr

Code Grundlagen[Bearbeiten | Quelltext bearbeiten]

Vorzeichenumkehr[Bearbeiten | Quelltext bearbeiten]

R1 <- ~R1
R1 <- R1 + 1

Weil die ALU im Zweierkomplement rechnet.

Zweimal links shiften[Bearbeiten | Quelltext bearbeiten]

Benötigt nur eine Instruktion:

R1 <- lsh(R1 + R1)

XOR[Bearbeiten | Quelltext bearbeiten]

# R0 = R1 XOR R2 = (R1 & ~R2) + (~R1 & R2)
R3 <- ~R2
R3 <- R1 & R3
R4 <- ~R1
R4 <- R4 & R2
R0 <- R3 + R4

Code Beispiele[Bearbeiten | Quelltext bearbeiten]

Gerades Paritätsbit[Bearbeiten | Quelltext bearbeiten]

R0 <- 0 # even parity of R1
(R1); if Z goto .end :loop
    R3 <- R1 & 1
    R3 <- R3 + R0
    R0 <- R3 & 1
    R1 <- rsh(R1)
    goto .loop
:end

Für ungerade Parität setzt man R0 anfänglich auf 1.

Multiplikation[Bearbeiten | Quelltext bearbeiten]

# Multiplikation zweier positiver Zahlen kleiner 2^8 - 1
# R0 = R1 * R2
(R1); if Z goto .end :loop
    R0 <- R0 + R2
    R1 <- R1 + (-1); goto .loop
:end

Division[Bearbeiten | Quelltext bearbeiten]

# R0 = R1 / R2
# R1 = R1 % R2
R0 <- 0
R2 <- ~R2
R2 <- R2 + 1
:loop
    (R1 + R2); if N goto .end
    R0 <- R0 + 1
    R1 <- R1 + R2
    goto .loop
:end

Arithmetischer right shift[Bearbeiten | Quelltext bearbeiten]

# R0 = R0 >>> 1
R1 <- rsh(-1)
R1 <- ~R1
R1 <- R0 & R1
R0 <- rsh(R0)
R0 <- R0 + R1