Anweisung auf eine Stackmaschine implementieren |
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Anweisung auf eine Stackmaschine implementieren |
|
Hallo
Zitat: |
Implementieren Sie die Anweisung e = (a + b)(c + (a + b) d) auf einer Stackmaschine.
- Sie haben die Befehle push (3 Taktzyklen), pop (3), add (1), mult (5) zur Verfügung.
- Sie haben zusätzlich den Befehl dup (1 Taktzyklus) zur Verfügung, der das oberste Stackelement dupliziert. Die Addition ist kommutativ (a + b = b + a).
Zählen Sie für beide Fälle die Anzahl der Befehle, die Anzahl der Speicherzugriffe (mit und ohne dem Einlesen der Befehlscodes) und
die Anzahl der Taktzyklen, die das Programm benötigt.
Ermitteln Sie auch, wie viele Bytes im Programmablauf zwischen Speicher und CPU transferiert werden, wenn ein Operationscode 1 Byte lang ist, Speicheradressen 2 Bytes und Operanden 4 Bytes. a, b, c und d stehen von Beginn an im Speicher. |
Also als erstes würde ich die Anweisung (a + b)(c + (a + b) d) in die "polnische"-Notation bringen,
also ab + d * c + ab + * (ich hoffe das stimmt so), und dann die Befehle ausführen, also:
PUSH a
PUSH b
ADD
PUSH d
MULT
PUSH c
ADD
PUSH a
PUSH b
ADD
MULT
POP
Okay, also funktioniert das so oder muss ich das mehr aufteilen?
BLAU a) wäre dann also 12.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Shizmo: 03.01.2016 13:32.
|
|
03.01.2016 13:32 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Okay super, danke.
Zitat: |
Zählen Sie die Anzahl der Taktzyklen, die das Programm benötigt |
Bei a) wäre dann für jedes Push 3, kommen sonst auch noch Taktzyklen vor?
Also 18 mMn.
Zitat: |
Zählen Sie die Anzahl der Speicherzugriffe (mit und ohne dem Einlesen der Befehlscodes |
Was wir denn alles unter einem Speicherzugriff verstanden? Sind das nicht nur die Push und Pop Befehle? Und die Befehlscodes sind die OP-Codes (also die, die in der Klammer danach stehen oder?).
|
|
03.01.2016 14:35 |
|
|
|
Du hast noch 2 MULT, 3 ADD und ein POP, also 18+2*5+3*1+1*3 = 34
Irgendwo muss ja auch die Informatin kommen, dass etwas addiert oder multipliziert werden soll. Ich denke du sollst hier für jeden Befehl ein pop rechnen, also 34+12*3 = 70
__________________ Syntax Highlighting fürs Board (Link)
|
|
03.01.2016 14:42 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Ah okay und ohne Einlesen der Befehlscodes wäre es dann 34+7*3 = 55 ? Oder 18+12*3 = 54 ?
Zitat: |
Ermitteln Sie auch, wie viele Bytes im Programmablauf zwischen Speicher und CPU transferiert werden, wenn ein Operationscode 1 Byte lang ist, Speicheradressen 2 Bytes und Operanden 4 Bytes. a, b, c und d stehen von Beginn an im Speicher. |
12*1Byte (alle Codes) + 6*2Bytes (alle PUSH) + 5*4Bytes(alle ADD und MULT) = 44 Bytes ????
|
|
03.01.2016 15:06 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Zitat: |
Original von eulerscheZahl
Zitat: |
Ah okay und ohne Einlesen der Befehlscodes wäre es dann 34+7*3 = 55 ? Oder 18+12*3 = 54 ? |
Das musst du mir jetzt erklären.
Ich komme wir oben ausgerechnet auf 34 da waren deine ursprünglichen 6 pop ja schon mit dabei. |
Laut Angabe gibt es die Anzahl der Speicherzugriffe mit und ohne dem Einlesen der Befehlscodes.
Mit wären ja: 34+12*3 = 70
Und bei ohne dachte ich mir ohne den (3 ADD und 2 MULT)-POPs, also 34+7*3 = 55
Dann noch zu b)
Würde das dann in etwa so aussehen?
PUSH a
PUSH b
ADD
DUP
PUSH d
MULT
PUSH c
ADD
MULT
POP
|
|
03.01.2016 22:51 |
|
|
|
Kosten für Befehl selbst und Befehlscode ohne Gewähr:
PUSH a 3 3
PUSH b 3 3
ADD 1 3
PUSH d 3 3
MULT 5 3
PUSH c 3 3
ADD 1 3
PUSH a 3 3
PUSH b 3 3
ADD 1 3
MULT 5 3
POP 3 3
gesamt: 34 36
Also 34 für die Befehle alleine. 34+36=70, wenn du den Code noch laden musst.
Die b) passt so.
__________________ Syntax Highlighting fürs Board (Link)
|
|
04.01.2016 07:53 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Hmm okay, aber dann wäre
Zitat: |
Zählen Sie die Anzahl der Taktzyklen, die das Programm benötigt |
dasselbe wie die Anzahl der Speicherzugriffe ohne dem Einlesen der Befehlscodes.
|
|
04.01.2016 10:48 |
|
|
|
Ich habe die ganze Zeit von den Taktzyklen gesprochen.
Das einzige, was ich zum Speicherzugriff geschrieben habe:
Zitat: |
Original von Shizrmo
12*1Byte (alle Codes) + 6*2Bytes (alle PUSH) + 5*4Bytes(alle ADD und MULT) = 44 Bytes ???? |
Zitat: |
Original von eulerscheZahl
Beim letzten Teil denke ich, dass die Variablen noch vom Speicher in den Prozessor geladen werden müssen. Aber an der Stelle bin ich auch keine verlässliche Quelle. |
__________________ Syntax Highlighting fürs Board (Link)
|
|
04.01.2016 10:56 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
|
23.01.2016 02:04 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Hoppala, war ein Fehler beim Abtippen:
|
|
23.01.2016 10:06 |
|
|
|
Ich komme bei deiner Rechnung auf .
a/(b+a) zu kopieren macht denke ich keinen Sinn, weil man es nur einmal verwenden kann.
Ich würde erst mal schauen, dass ich die Doppelbrüche wegbekomme: .
Dadurch wird die Rechnung aber eher länger als kürzer
__________________ Syntax Highlighting fürs Board (Link)
|
|
23.01.2016 10:36 |
|
|
Shizmo
Tripel-As
Dabei seit: 16.10.2015
Beiträge: 174
|
|
Hmmm, eigenartig. Aber die a) passt soweit?
|
|
23.01.2016 10:48 |
|
|
|