Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Informatik Vorkurs Programmieren.pdf
Скачиваний:
13
Добавлен:
19.03.2016
Размер:
2.38 Mб
Скачать

380

 

 

 

 

 

 

 

 

 

 

Lektion 6

Indirekte Adressierung

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

R(2)

10

 

 

 

 

 

 

 

 

 

 

 

 

R(3)

2

 

 

 

 

 

 

 

 

 

 

 

R(4)

1

 

 

 

 

 

 

 

 

 

 

 

R(6)

1

 

 

R(2)

11

 

 

 

 

 

 

 

 

 

 

 

 

R(4)

5

 

 

Lies ein in REG(1)

 

R(6)

Inhalt(R(6)) + 1

 

 

 

 

 

 

 

 

 

 

 

 

NEIN

 

 

 

 

 

 

 

 

 

 

 

 

 

Inhalt(REG(1))=0?

JA

 

Inhalt(R(6))=2?

JA

Fortsetzung

 

 

 

 

 

 

 

 

 

NEIN

R(Inhalt(R(4))) Inhalt(R(Inhalt(R(4)))) + 1

R(Inhalt(R(2))) Inhalt(REG(1))

R(2) Inhalt(R(2)) + 2

Abbildung 6.4

Zusammenfassung

Die Tabelle 6.2 auf Seite 385 beinhaltet alle 21 Befehle unseres ASSEMBLERS und zeigt in kurzer Beschreibung ihre Wirkung.

Die indirekte Adressierung ist ein wichtiges Programmierkonzept. Man kann die Adresse des Registers, mit welchem gearbeitet wird, durch den Inhalt eines anderen Registers R’ angeben. Durch Rechnungen mit dem Inhalt von R’ können wir dann die Adresse jenes Registers bestimmen, mit dem wir als nächstes arbeiten wollen. Der Vorteil liegt darin, dass wir den Inhalt von R’ bei jedem Durchlauf in einer Schleife ändern können und damit soviele unterschiedliche Register während der Ausführung der Schleife verwenden können wie die vorher unbekannte Anzahl der Schleifendurchläufe.

Außer der oben diskutierten Verwendung ermöglicht uns eine indirekte Adressierung eine Verkürzung von Programmen, indem man ähnliche Teile durch einen parametrisierten Programmteil ersetzen kann.

Kontrollfragen

1.In welchen Situationen braucht man die indirekte Adressierung? Was ermöglicht sie?

2.Welchen Befehl der indirekten Adressierung hat man für den Datentransfer aus der CPU in den Hauptspeicher? Was bewirkt er?

3.Welchen Befehl der indirekten Adressierung hat man für den Datentransfer aus dem Speicher in die CPU? Was bewirkt er?

381

4.Wie gehst du vor, wenn du mittels einer Schleife und nicht durch eine lange Folge von hunderten Befehlen eine Folge von 100 Zahlen in der Warteschlange in die Register mit den Adressen 10, 11, 12, . . . , 109 speichern sollst?

Kontrollaufgaben

1.Betrachte die gleiche Eingabe a1, a2, . . . , an, 0, b1, b2, . . . , bn, 0 wie in Beispiel 6.1. Die Länge n der Folgen ist vorher nicht bekannt. Interpretiere die Eingabe als zwei Punkte (a1, a2, . . . , an) und (b1, b2, . . . , bn) des n-dimensionalen Raums. Schreibe ein Programm, das die Euklidische Distanz (Entfernung) der beiden Punkte berechnet. Brauchst du dazu die indirekte Adressierung?

2.Die Eingabe ist die Gleiche wie in Kontrollaufgabe 1. Entwirf ein Programm, das die Entfernung der Punkte

(a1, a2, . . . , an) und (bn, bn−1, . . . , b1)

bestimmt.

3.In der Warteschlange steht nur eine Zahl n. Es soll ein Programm entwickelt werden, welches die Inhalte der Register

R(100), R(101), . . . , R(100+n)

in die Register

R(101), R(102), . . . , R(100+n+1)

so verschiebt, dass der Inhalt von R(k) nach der Ausführung des Programms in R(k+1) liegt.

4.In der Warteschlange stehen 20 ganze Zahlen. Du sollst ein Programm entwickeln, das diese Zahlen aufsteigend sortiert in die Register mit Adressen 1, 2, . . . , 20 abspeichert.

5.In der Warteschlange steht eine Folge von ganzen Zahlen, die unterschiedlich von 0 sind. Die Anzahl der Zahlen ist unbekannt. Das Ende der Folge erkennt man durch die Zahl 0. Du sollst ein Programm in ASSEMBLER schreiben, das Folgendes leistet: Es speichert alle positiven Zahlen in Registern mit geraden Adressen 100, 102, 104, . . . . Die negativen Zahlen sollen in Registern mit ungeraden Adressen 101, 103, 105, . . . abgespeichert werden.

382

Lektion 6 Indirekte Adressierung

6. Simuliere die Arbeit des Programms

1 LOAD1 =10

2 STORE 2

3 LOAD1 =2

4 STORE 3

5 READ

6 JZERO 16

7 STORE 2

8 LOAD1 2

9 LOAD2 3

10SUB

11STORE 2

12LOAD1 1

13ADD1

14STORE 1

15JUMP 5

16END

auf der Eingabe -7, 3, 2, 0 und zeichne die Änderungen des Speicherinhalts nach der Ausführung jedes Rechnerschrittes auf.

7.Betrachte die gleiche Aufgabe wie in Kontrollaufgabe 3, nur mit dem Unterschied, dass man die Registerinhalte um zehn Positionen verschieben will. Entwickle mindestens zwei unterschiedliche Strategien zu diesem Zweck.

Lösungen zu ausgesuchten Aufgaben

Aufgabe 6.2

Das folgende Programm mit vier Befehlen der indirekten Adressierung bewirkt die in der Tabelle 6.1 dargestellte Datenänderung.

1 READ

2 STORE 1

3 LOAD1 =10

4 STORE 2

5 READ

6 STORE 2

7 ADD1

8 STORE 1

9 READ

383

10 STORE 1

11 LOAD 2 oder LOAD1 2

12ADD1

13STORE 3

14LOAD 3 oder LOAD1 3

15END

Aufgabe 6.4

Es sind nur zwei kleine Änderungen notwendig. Am Anfang legt man anstatt 101 die Zahl 10 in R(1). Damit steht in der ersten Zeile LOAD1 =10, wo vorher LOAD1 =101 stand. In der Schleife muss man dann den Inhalt von R(1) immer um 2 statt um 1 erhöhen. Im Assemblerprogramm kann die Zeile ADD1 nochmals wiederholt werden, um den Inhalt von R(1) um 2 zu vergrößern. Wie würdest du vorgehen, wenn du anstatt des Befehls ADD1 den Befehl ADD vorzögest?

Kontrollaufgabe 3

Die Aufgabe wäre einfach, wenn bei der Abspeicherung einer Zahl in einem Register der vorherige Inhalt des Registers nicht automatisch gelöscht würde. Bevor wir also den Inhalt von R(100) in R(101) speichern, müssen wir den Inhalt von R(101) irgendwo speichern. Wir verwenden R(10) zum Speichern des zu übertragenden Inhaltes (z.B. am Anfang von R(100)) und R(11) zum Speichern jener Zahl, welche sonst gelöscht würde (z.B. am Anfang der Zahl in R(101)). Danach schieben wir den Inhalt von R(11) in R(10) und in R(11) legen wir die Zahl, die sonst bei der nächsten Übertragung gelöscht werden würde. Wir wiederholen dies n-mal, indem wir am Anfang n in REG(1) legen und diesen Wert nach jedem Durchlauf der Schleife um 1 verkleinern. Die Strategie ist im Flussdiagramm von Abb. 6.5 dargestellt. Die Implementierung in ASSEMBLER überlassen wir dir.

384

Lektion 6 Indirekte Adressierung

R(1) 101

Lese ein in REG(1)

R(10) Inhalt(R(100))

R(11) Inhalt(R(101))

R(101) Inhalt(R(10))

JA

Inhalt(REG(1))=0? END

NEIN

R(10) Inhalt(R(11))

R(1) Inhalt(R(1)) + 1

R(11) Inhalt(R(Inhalt(R(1))))

R(Inhalt(R(1))) Inhalt(R(10))

REG(1) REG(1) - 1

Abbildung 6.5

385

Befehl

Wirkung

READ

REG(1) die erste Zahl in der Warteschlange

 

R(0)

Inhalt(R(0)) + 1

STORE i

R(i) Inhalt(REG(1))

 

R(0)

Inhalt(R(0)) + 1

LOAD1 i

REG(1) Inhalt(R(i))

 

R(0)

Inhalt(R(0)) + 1

LOAD2 i

REG(2) Inhalt(R(i))

 

R(0)

Inhalt(R(0)) + 1

LOAD1 =i

REG(1) i

 

R(0)

Inhalt(R(0)) + 1

LOAD2 =j

REG(2) j

 

R(0)

Inhalt(R(0)) + 1

ADD

REG(1) Inhalt(REG(1)) + Inhalt(REG(2))

 

R(0)

Inhalt(R(0)) + 1

SUB

REG(1) Inhalt(REG(1)) Inhalt(REG(2))

 

R(0)

Inhalt(R(0)) + 1

MULT

REG(1) Inhalt(REG(1)) Inhalt(REG(2))

 

R(0)

Inhalt(R(0)) + 1

DIV

Wenn Inhalt(REG(2)) = 0, melde „ERROR“, sonst

 

REG(1) Inhalt(REG(1)) / Inhalt(REG(2))

 

R(0)

Inhalt(R(0)) + 1

ADD1

REG(1) Inhalt(REG(1)) + 1

 

R(0)

Inhalt(R(0)) + 1

SUB1

REG(1) Inhalt(REG(1)) 1

 

R(0)

Inhalt(R(0)) + 1

WRITE i

Ausgabe Inhalt(R(i))

 

R(0)

Inhalt(R(0)) + 1

WRITE1

Ausgabe Inhalt(REG(1))

 

R(0)

Inhalt(R(0)) + 1

WRITE =j

Ausgabe j

 

R(0)

Inhalt(R(0)) + 1

JZERO j

if Inhalt(REG(1)) = 0 then R(0) j

 

else R(0) Inhalt(R(0)) + 1

JGTZ j

if Inhalt(REG(1)) > 0 then R(0) j

 

else R(0) Inhalt(R(0)) + 1

JUMP j

R(0)

j

END

Ende der Ausführung des Programms

STORE i

R(Inhalt(R(i))) Inhalt(REG(1))

 

R(0)

Inhalt(R(0)) + 1

LOAD1 j

REG(1) R(Inhalt(R(j)))

 

R(0)

Inhalt(R(0)) + 1

Tabelle 6.2 Befehlstabelle

Modul III

Entwurf von endlichen Automaten

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]