Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
Beide Seiten, vorherige Überarbeitung Vorherige Überarbeitung Nächste Überarbeitung | Vorherige Überarbeitung | ||
gf_informatik:computerarchitektur_sca:aufgaben_d [2023-08-24 22:06] – [Aufgabe D2: Maximum] sca | gf_informatik:computerarchitektur_sca:aufgaben_d [2023-09-25 07:24] (aktuell) – [Lösungen] sca | ||
---|---|---|---|
Zeile 5: | Zeile 5: | ||
**Ziel:** einen Countdown ($10$ bis $0$) mit dem LMC programmieren. | **Ziel:** einen Countdown ($10$ bis $0$) mit dem LMC programmieren. | ||
- | 1) Programmiere zuerst den Countdown mit Python mit einer *while-*Schleife. Es sollen also einfach der Reihe nach die Zahlen von $10$ bis $0$ ausgegeben werden. | + | Dokumentiere die Aufgabe auf OneNote. Mache dazu eine neue Seite. |
+ | |||
+ | 1) Programmiere zuerst den Countdown mit Python mit einer *while-*Schleife. Es sollen also einfach der Reihe nach die Zahlen von $10$ bis $0$ ausgegeben werden. Füge den Code als Screenshot in die Dokumentation ein. | ||
++++Lösungen| | ++++Lösungen| | ||
Zeile 18: | Zeile 20: | ||
++++ | ++++ | ||
- | 2) Mache einen Plan, wie du das mit dem LMC umsetzen willst. Welchen der drei Branch-Befehle verwendest du? | + | 2) *Notiere* in deiner Dokumentation: |
++++Lösungen| | ++++Lösungen| | ||
Zeile 36: | Zeile 38: | ||
3) Programmiere den Countdown mit LMC. Der Output soll also sein: | 3) Programmiere den Countdown mit LMC. Der Output soll also sein: | ||
{{ : | {{ : | ||
+ | |||
+ | Screenshot in Dokumentation einfügen. | ||
Zeile 59: | Zeile 63: | ||
Im RAM wird dann direkt nach dem `000` von `HLT` der Wert $5$ gespeichert. Auf die Adresse von Wert $5$ kann man dann über den angegebenen Namen, also hier `FIVE` zugreifen, z.B. `ADD FIVE`. | Im RAM wird dann direkt nach dem `000` von `HLT` der Wert $5$ gespeichert. Auf die Adresse von Wert $5$ kann man dann über den angegebenen Namen, also hier `FIVE` zugreifen, z.B. `ADD FIVE`. | ||
- | Passe deinen Countdown-Code an, indem du die beiden benötigten Werten (Startwert & Schrittweite) auf diese Weise speicherst und verwendest. | + | Passe deinen Countdown-Code an, indem du die beiden benötigten Werten (Startwert & Schrittweite) auf diese Weise speicherst und verwendest. Screenshot in Dokumentation einfügen. |
++++Lösung| | ++++Lösung| | ||
Zeile 79: | Zeile 83: | ||
Kennzeichne eine Zeile Code, du der du springen möchtest, mit einem Keyword, z.B. wird Zeile 1 im Code hier von `OUT` zu `LOOP OUT`. Mit `< | Kennzeichne eine Zeile Code, du der du springen möchtest, mit einem Keyword, z.B. wird Zeile 1 im Code hier von `OUT` zu `LOOP OUT`. Mit `< | ||
- | Implementiere dies in deinem Code. | + | Implementiere dies in deinem Code. Screenshot in Dokumentation einfügen. |
++++Lösung| | ++++Lösung| | ||
< | < | ||
- | LDA TEN | + | LDA START // Lade Startwert in Akk. |
LOOP OUT | LOOP OUT | ||
SUB ONE | SUB ONE | ||
- | BRP LOOP | + | BRP LOOP // Falls Akk. > 0, Countdown also noch nicht fertig springe nach oben (zu LOOP) |
HLT | HLT | ||
ONE DAT 1 | ONE DAT 1 | ||
- | TEN DAT 10 | + | START DAT 10 |
+ | </ | ||
+ | |||
+ | Der grosse Unterschied in der Logik zwischen dem Python- und Assemblercode ist: | ||
+ | |||
+ | * Python: Zuerst wird Bedingung (`x >= 0`) überprüft und erst *nachher* wird der Codeblock (`print(x), x = x - 1`) ausgeführt. | ||
+ | * Assemblercode: | ||
+ | |||
+ | Man kann seinen Assemblercode aber auch so schreiben, dass er näher an der Logik des Python-Codes ist. Allerdings wird er dann etwas komplizierter: | ||
+ | < | ||
+ | LDA START | ||
+ | JMP | ||
+ | BRA END // springe zum Ende, falls Loop fertig (Ziel erreicht) | ||
+ | LOOP OUT // Anfang Codeblock des Loops | ||
+ | SUB ONE | ||
+ | BRA JMP // Ende des Codeblocks, springe zur Überprüfung der Bedingung | ||
+ | END HLT // Beende Programm | ||
+ | START DAT 10 | ||
+ | ONE DAT 1 | ||
+ | </ | ||
+ | |||
+ | Eine weitere Lösung: | ||
+ | < | ||
+ | LDA START | ||
+ | LOOP OUT | ||
+ | BRZ END | ||
+ | SUB ONE | ||
+ | BRA LOOP | ||
+ | END HLT | ||
+ | START DAT 10 | ||
+ | ONE DAT 1 | ||
</ | </ | ||
Zeile 134: | Zeile 168: | ||
- | ==== Aufgabe D3: Multiplikation | + | ==== Aufgabe D3: 3er-Reihe |
- | **Ziel: | + | **Ziel: |
1) Programmiere das Programm zuerst mit Python. Dabei dürfen nur die mathematischen Operationen $+$ und $-$ verwendet werden. | 1) Programmiere das Programm zuerst mit Python. Dabei dürfen nur die mathematischen Operationen $+$ und $-$ verwendet werden. | ||
Zeile 143: | Zeile 177: | ||
<code python> | <code python> | ||
- | a = input() | + | n = input() |
- | b = input() | + | |
- | r = 0 # result | + | |
- | + | ||
- | while a > 0: | + | |
- | r = r + b | + | |
- | a = a - 1 | + | |
- | print(r) | + | x = 3 |
+ | while n > 0: | ||
+ | | ||
+ | x = x + 3 | ||
+ | n = n - 1 | ||
</ | </ | ||
Zeile 159: | Zeile 191: | ||
3) Implementiere es mit dem LMC. | 3) Implementiere es mit dem LMC. | ||
+ | |||
===== Lösungen ===== | ===== Lösungen ===== | ||
- | < | + | < |
++++Lösungen| | ++++Lösungen| | ||
Zeile 185: | Zeile 218: | ||
</ | </ | ||
- | == Multiplikation | + | == 3er-Reihe |
< | < | ||
INP | INP | ||
- | STO A | + | STO N |
- | INP | + | LOOP |
- | STO B | + | BRZ END // jump to end if N=0 |
- | JUP LDA A | + | |
- | BRZ FINE | + | |
SUB ONE | SUB ONE | ||
- | | + | |
- | LDA R | + | LDA X |
- | ADD B | + | |
- | STA R | + | |
- | BRA JUP | + | |
- | FINE LDA R | + | |
OUT | OUT | ||
- | HLT | + | |
+ | STO X | ||
+ | BRA LOOP | ||
+ | END HLT | ||
+ | N DAT 0 | ||
+ | X DAT 3 | ||
+ | STEP DAT 3 | ||
ONE DAT 1 | ONE DAT 1 | ||
- | A DAT 0 | ||
- | B DAT 0 | ||
- | R DAT 0 | ||
</ | </ | ||
+ | |||
++++ | ++++ | ||
</ | </ |