LC-2-Simulator
Der Little Computer 2 (LC–2) wurde an der Universität von Michigan (USA) für die Ausbildung entwickelt, um Studenten ohne weitere Vorkenntnisse in Rechnerarchitektur und Logikentwurf mit Aufbau und Funktion von Universalrechnern vertraut zu machen. Die Funktionsweise des LC–2 ist durch seine Architektur und seinen Befehlsatz definiert.
Attribute : 16-Bit-Prozessor; 8 Allzweckregister von je 16 Bit Breite; ein Register ist der Programm-Counter PC, er enthält die Speicheradresse des nächsten Befehls; Arithmetik–Logik–Einheit (ALU) verarbeitet ebenfalls 16–Bit Worte; verfügt neben den Registern R0 bis R7 über drei Flipflops, Flags;
N Ergebnis der letzten Operation war negativ. Z Ergebnis der letzten Operation war null. P Ergebnis der letzten Operation war positiv.
Die Adressbreite beträgt 16 Bit, so dass die Maschine über 216 (65536 oder 64K) Worte bzw. 128 KB Speicher verfügt. Man kann den Speicher des LC–2 als in 27 = 128 Seiten zu je 29 = 512 Worten unterteilt betrachten. Die oberen 7 Bit der PC Registers bestimmen dabei die Seite. Ein– und Ausgabegeräte erscheinen im Speicher an festgelegten Adressen. Der Bereich von 0x3000 bis 0xCFFF steht für Programme zur Verfügung. Die Programme beginnen in der Regel bei Adresse 0x3000.
Zeilenweise Anzeige des Speicherinhalts erfolgt nach folgendem Prinzip:
Adresse (hex) | Inhalt (binär) | Inhalt (hex) | Marke | Assemblermnemonic (bei Befehlen) | |
Beispiel | 0x3001 |
0001001000100000 |
0x1220 | LOOP | ADD R1, R0, #0000 |
Arithmetisch/Logische Operationen: | ADD, AND und NOT |
Datentransferbefehle: | LD, LDI, LDR, ST, STI, STR, LEA |
Ablaufsteuerung: | BR, JSR, JMP, JSRR, RET |
Steuerbefehle: | RTI, TRAP |
Name der Adressierungsart | Bedeutung | Beispiel |
Register | Das Datum befindet sich im angegebenen Register | add r1, r2, r3 |
Immediate (unmittelbar) | Das Datum ist Teil des Befehls selbst. Im Beispiel ist #5 das "immediate" Datum. | add r1, r2, #5; lea r1, LABEL |
Direkt | Das Datum befindet sich an der angegebenen Adresse auf der aktuellen Seite. | ld r1, LABEL |
Indirekt | Die angegebene Adresse auf der aktuellen Seite enthält die Adresse des Datums. | ldi r1, LABEL |
Basis+Index | Das Datum befindet sich an der Adresse, die sich aus der Summe des Basisregisterinhalts und des null–erweiterten Indexes ergibt. | ldr r1, r2, #3 |
AND Bitwise Logical AND
if (bit<5> == 0) {DR = SR1 AND SR2 }
else if (bit<5> == 1) { DR = SR1 AND SEXT(imm5) } setcc(DR) |
Wenn Bit
<5> == 0, dann den bitweise UND des Inhalts von SR1 und SR2 durchführen,
ansonsten. wenn Bit <5> == 1, dann den bitwise UND des Inhalts von
SR1 durchführen und den unmittelbaren Wert. Das Ergebnis wird in
beiden Fällen im DR gestellt und setzt die Bedingungscodes.
|
ADD
if (bit<5> == 0) { DR = SR1 + SR2 }
else if (bit<5> == 1) {DR = SR1 + SEXT(imm5)} setcc(DR) |
Wenn Bit
<5> == 0, dann den Inhalt von
SR1 und SR2 hinzufügen, sonst,
wenn Bit
<5> == 1, dann den Inhalt von SR1 und den Wert hinzufügen.
Das Ergebnis wird in beiden Fällen im DR gestellt und setzt die Bedingungscodes.
|
Ein Erstes Programm : Addieren von Zahlen
(0000) 3000 0011 0000 0000 0000 ( 1) .ORIG x3000 ;Start (3000) 5260 0101 001 001 1 00 000 ( 2) AND R1 R1 #0 ;Löschen Register R1 (3001) 54A0 0101 010 010 1 00 000 ( 3) AND R2 R2 #0 ;Löschen Register R2 (3002) 126A 0001 001 001 1 01010 ( 4) ADD R1 R1 #10 ;R1 := R1 + 10 (3003) 1441 0001 010 001 0 00 001 ( 5) ADD R2 R1 R1 ;R2 := R1 + R2 (3004) F025 1111 0000 0010 0101 ( 6) TRAP x25 ;Ende
Ein Zweites Programm Subtraktion
Lösung erfolgt über Zweierkomplement
1011 - 0100 = 1011+ 1011 + 0001 = 0111
(0000) 3000 0011 0000 0000 0000 ( 1) .ORIG x3000 ; Start (3000) 5260 0101 001 001 1 00 000 ( 2) AND R1 R1 #0 (3001) 54A0 0101 010 010 1 00 000 ( 3) AND R2 R2 #0 (3002) 56E0 0101 011 011 1 00 000 ( 4) AND R3 R3 #0 (3003) 126B 0001 001 001 1 01 011 ( 5) ADD R1 R1 #11 ; Einlesen der Zahl 11 in R1 (3004) 14A4 0001 010 010 1 00 100 ( 6) ADD R2 R2 #4 ; Einlesen der Zahl 4 in R2 (3005) 94BF 1001 010 010 1 11 111 ( 7) NOT R2 R2 ; Negation von R2 (Einerkompliment) (3006) 14A1 0001 010 010 1 00 001 ( 8) ADD R2 R2 #1 ; +1 --> Zweierkompliment (3007) 1642 0001 011 001 0 00 010 ( 9) ADD R3 R1 R2 ; Addition von R1 + R2 (3008) F025 1111 0000 0010 0101 ( 10) TRAP x25 ; Stop
Übersetzung eines Binärcodes (Interpretation)
3000 56E0 5920 1921 5A84 0406 1643 1241 1904 0A03 F025 |
0011 0000 0000 0000 0101 011 011 1 00000 0101 100 100 1 00000 0001 100 100 1 00001 0101 101 010 0 00 100 0000 010 0 0000 0110 0001 011 001 0 00 011 0001 001 001 0 00 001 0001 100 100 0 00 100 0000 101 0 0000 0011 1111 0000 0010 0101 |
ST AND AND ADD AND BR ADD ADD ADD BR TRAP |
Store Direct from Register to Memory R3 := R3 ^ 0 R4 := R4 ^ 0 R4 := R4 + 1 R5 := R2 ^ R4 Zweig zurPos. x3006(*) [110-->BRZ] R3 := R1 + R3 R1 := R1 + R1 R4 := R4 + R4 Zweig zur Pos. x3003(°) [101-->BRNP] Ende |
.orig x3000 AND R3,R3,#0 AND R4,R4,#0 ADD R4,R4,#1 And R5,R3,R4 BRZ $6 ADD R3,R3,R1 ADD R1,R1,R1 ADD R4,R4,R4 BRNP $3 .END |
BR Branch to Location on Current Page ;
* 010 --> gleich Null
° 101 --> ungleich negativ oder positiv
weiter