Mikroprogramm für CISC Prozessor

Kirby.exe

Top Contributor
Also wir haben die Aufgabe jeweils ein Mikroprogramm für den Befehl SWAP und ADDL zu schreiben...soweit so gut, ich habe hier mal etwas pseudocode:



Code:
SWAP: tmp = $sp;
      $sp = $ac;
      $ac = tmp;

Durch diesen Befehl tauschen scheinbar der Stackpointer und das Arbeitsregister ihre Wert...Was ich mich jedoch fragen, warum tut man das und was bewirkt dieser Vorgang?
 

mihe7

Top Contributor
LOL, ja, mihe7 bei der Arbeit...

Kurz: Ein Tauschen bewirkt... ein Tauschen :) Warum macht man das? Ich sehe da verschiedene Gründe, wobei der Ausgangspunkt sein dürfte, dass im Akku ein Wert steht, der nicht verloren gehen darf.

1. Register bieten ja nur begrenzt Platz an. Ohne einen SWAP-Befehl müsstest Du temporär ein Register belegen.
2. POP, PUSH und MOVE sind drei Befehle, ein SWAP nur einer

Ein Anwendungsbeispiel: auf dem Stack liegt ein Wert, der erhöht werden soll. Der Inhalt des Akkus darf nicht verloren gehen und der inc-Befehl funktioniert nur mit dem Akku. SWAP, INC, SWAP ist kürzer als POP rx, PUSH ac, MOVE ac, rx, INC, POP rx, PUSH ac, MOVE ac, rx
 

Kirby.exe

Top Contributor
LOL, ja, mihe7 bei der Arbeit...

Kurz: Ein Tauschen bewirkt... ein Tauschen :) Warum macht man das? Ich sehe da verschiedene Gründe, wobei der Ausgangspunkt sein dürfte, dass im Akku ein Wert steht, der nicht verloren gehen darf.

1. Register bieten ja nur begrenzt Platz an. Ohne einen SWAP-Befehl müsstest Du temporär ein Register belegen.
2. POP, PUSH und MOVE sind drei Befehle, ein SWAP nur einer

Ein Anwendungsbeispiel: auf dem Stack liegt ein Wert, der erhöht werden soll. Der Inhalt des Akkus darf nicht verloren gehen und der inc-Befehl funktioniert nur mit dem Akku. SWAP, INC, SWAP ist kürzer als POP rx, PUSH ac, MOVE ac, rx, INC, POP rx, PUSH ac, MOVE ac, rx
Was ist denn Arbeit? :p Ja gut mit dem von dir genannten Beispiel macht es schon Sinn :) Dankeee
 

Kirby.exe

Top Contributor
@mihe7 irgendwie habe ich dennoch ein paar Frage Zeichen, wie würde es aussehen etwas von einer Speicherzelle ($ac) in eine irgendeine andere zu kopieren, also in Form einer Mikroprogrammzeile?

Hier sind mal ein paar weiter Infos zum Prozessor:

12956
12957
 

Meniskusschaden

Top Contributor
Mal als Anfang: du willst aus der durch AC referenzierten Speicherzelle einen Wert auslesen. Das RAM-Adressregister wird über das B-Latch befüllt. Also muss Signal B schon mal 0001 enthalten.
 

Kirby.exe

Top Contributor
@mihe7 Könntest du mal drüber schauen? Ich bin mir nicht ganz sicher ob das überhaupt sinn macht, was ich hier aufgeschrieben habe :)
Code:
Amux = 0, COND = 000, SHIFT = 00, ALU = 00, MD = 1, MA = 1, RD = 1, WR = 0, ENC = 0, C = 0000, A = 0000, B = 0000, ADDR = 00000000
Amux = 0, COND = 100, SHIFT = 00, ALU = 00, MD = 1, MA = 0, RD = 1, WR = 0, ENC = 0, C = 0000, A = 0000, B = 0000, ADDR = 00000001
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0100, A = 0010, B = 0000, ADDR = 00000000  # tir= $sp
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0010, A = 0001, B = 0000, ADDR = 00000000  # $sp= $ac
Amux = 0, COND = 000, SHIFT = 00, ALU = 10, MD = 0, MA = 0, RD = 1, WR = 1, ENC = 1, C = 0001, A = 0100, B = 0000, ADDR = 00000000  # $ac= tir
 

mihe7

Top Contributor
Ich denke mal, Du musst die Übertragung aus dem RAM in mehreren Schritten erledigen.
1. b := sp, rd
2. warte, bis übertragung beendet
3. tir := memory-i/o-register + b (d. h. amux=1, b = 0, c = 4 (tir), enc=1, wr=1)
 

Neue Themen


Oben