CPU Programm schreiben < Technische Inform. < Praktische Inform. < Hochschule < Informatik < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 16:59 Sa 02.12.2006 | Autor: | diecky |
Aufgabe | 1) Betrachten Sie folgende Speicherinhalte von Adresse 0 mit einschließlich Adresse 21 und interpretieren Sie ihn als ein Programm. Was wird durch dieses Programm berechnet?
2) Schreiben Sie ein Programm, das für zwei Zahlen x,y
s = x*y / x +y
berechnet. Das Ergebnis s soll bei Adresse 4 gespeichert werden, wobei x bei Adresse 2 und y bei Adresse 3 gespeichert sei und das Programm selbst bei Adresse 5 beginnt. Kommentieren Sie ihr Programm ausführlich! |
zu 1) die Tabelle:
Adresse a Inhalt RAM[a]
0 2
1 22
2 5
3 2
4 23
5 7
6 4
7 1
8 24
9 11
10 25
11 3
12 100
13 5
14 2
15 24
16 9
17 4
18 1
19 24
20 10
21 25
zu 2) die Tabelle:
Adresse a Inhalt RAM[a]
0 10
1 5
2 x
3 y
4 s
Ich weiß irgendwie gar nicht so recht wie ich wo anfangen muss?!?
Wär echt super,wenn ihr mir helfen könntet!!!
Habe zusätzlich noch eine Tabelle mit den Operationscodes bzw Wirkungen der Operation hinzugefügt,die man dafür wohl benötigt.
Vielen Dank!!
[Dateianhang nicht öffentlich]
Dateianhänge: Anhang Nr. 1 (Typ: jpg) [nicht öffentlich]
|
|
|
|
Hallo,
mach dir bitte die Rolle der einzelnen Komponenten der CPU klar.
Was enthalten die einzelnen Register Reg, Akku und PC?
Was steht im RAM?
Angefangen wird bei RAM-Adresse 0. Du schaust in der Tabelle nach der Bedeutung der 2: Es wird Reg beschrieben. Womit Reg beschrieben wird, ist RAM[RAM[PC+1]], also RAM[RAM[1]]=RAM[22]. Das Register Reg wird also mit dem Wert in Speicherzelle 22 beschrieben. Konkreter geht es nicht, weil uns nur der Speicherinhalt bis 21 bekannt ist.
Dann wird laut Tabelle der PC um 2 hochgezählt, also PC=2.
Die nächste Instruktion steht also in Speicherzelle 2 (PC gibt aktuelle Programmposition an!). Wir schauen nach: Die Instruktion ist 5. Tabelle sagt: Inhalt von Reg in Akku schreiben.
Schließlich wird PC um 1 hochgezählt. PC=3.
Weiter: Instruktion in Speicherzelle 3 ist 2. Tabelle sagt: Reg beschreiben mit RAM[RAM[PC+1]]=RAM[RAM[4]]=RAM[23].
Dann PC hochzählen um 2.
usw...
Am besten ist, du schreibst dir nach jeder abgearbeiteten Instruktion den Inhalt aller Register und den Inhalt der ggf. veränderten Speicherzelle des RAMs auf. Also z.B. so
Start: PC=0, Akku=unbekannt, Reg=unbekannt
nach Instruktion in RAM[0] --> Akku=unbekannt, Reg=RAM[22], PC=2
nach Instruktion in RAM[2] --> Akku=RAM[22], Reg=RAM[22], PC=3
nach Instruktion in RAM[3] --> Akku=RAM[22], Reg=RAM[23], PC=5
nach Instruktion in RAM[5] --> Akku=RAM[22]-RAM[23], Reg=RAM[23], PC=6
nach Instruktion in RAM[6] --> Akku=RAM[22]-RAM[23], Reg=RAM[22]-RAM[23], PC=7
nach Instruktion in RAM[7] --> Akku=RAM[22]-RAM[23], Reg=RAM[22]-RAM[23], PC=9, RAM[24]=RAM[22]-RAM[23]
nach Instruktion in RAM[9] ....
usw.
Es ist wirklich nicht schwer, man muss es nur systematisch angehen. Nach Ablauf des Programms kann man dann sehen, was die CPU für Werte im RAM gespeichert hat und/oder, was sie als nächstes tun würde.
Schau dir das in Ruhe an, löse zuerst die erste Aufgabe und überlege dir dann, ob dir das nicht bei der Lösung der zweiten Aufgabe hilft
Gruß
Martin
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:36 So 03.12.2006 | Autor: | diecky |
Ja ok,das habe ich jetzt gemacht (war auch in der vorherigen Aufgabe gefragt und hatte das halt schon ;)).
Die Frage ist jetzt eben nur WAS genau dieses Programm denn überhaupt macht? Ich habe folgende Überlegung angestellt:
Es finden ja folgende Abläufe statt:
LOAD REG
COPY REG_AKKU
LOAD REG
SUB
COPY AKKU_REG
STORE REG
BRANCH ON ZERO
ASSIGN REG
COPY REG_AKKU
LOAD REG
DIV
COPY AKKU_REG
STORE REG
GO TO
Kann es dann vielleicht sein, dass das Programm dies tut?:
Es lädt eine Zahl in die REG, macht eine Kopie davon und speichert es in Akku, holt sich dann die nächste Zahl und subtrahiert beide Zahlen. Das Ergebnis wird dann in der REG und AKKU gespeichert.
Danach springt der PC 3 Zeilen weiter und kopiert den Wert in die REG und in AKKU, holt sich wieder eine neue Zahl und dividiert die beiden Zahlen diesmal. Das Ergebnis wird wieder in REG und AKKU gespeichert.
GROßES FRAGEZEICHEN?!
Danke
|
|
|
|
|
Hallo,
der Ablauf bis zur Subtraktion ist ja so weit ok. Allerdings solltest du immer mitschreiben, was woher wo gespeichert wird, denn nach Ablauf des Programms sollst du sagen können, was die Aufgabe des Programms ist.
Also schreib immer schön mit, wann welche Speicherzelle verändert wurde.
Der Satz "Das Ergebnis wird dann in der REG und AKKU gespeichert" gefällt mir nicht. Bei der Subtraktion wird die Differenz automatisch im Akku gespeichert. Darauf folgen die Befehle COPY AKKU_REG, STORE REG. Ersterer Kopiert den Wert im Akku in das Reg. Letzterer speichert den (neuen) Wert des Reg im RAM (Die Adresse steht direkt dahinter).
Wo der Wert im RAM gespeichert wird, ist wichtig, da dies evtl. für den späteren Programmablauf benötigt wird!
Dann folgt eine Fallunterscheidung. Falls der Wert, der jetzt im Akku steht (also das letzte Rechenergebnis) gleich 0 ist, springen wir zu RAM[25], sonst gehen wir einfach zwei Adressen weiter und machen dort die Division (mit welchen Zahlen?).
Wie kommst du auf "Danach springt der PC 3 Zeilen weiter "?
Es ist wichtig, dass du jede Zuweisung verstehst und aufschreibst. Falls es dir schwerfällt, mit RAM[23] u.ä. zu rechnen, kannst du ja folgende Benennung vornehmen:
RAM[22] = a
RAM[23] = b
RAM[24] = c
Dann kannst du hier mit Variablen rechnen. Die Subtraktion wäre dann a-b usw.
Probier es doch mal.
Gruß
Martin
|
|
|
|