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 21:59] – [Aufgabe D3: 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: |
| - | ==== Aufgabe D2: Multiplikation ==== | + | * Python: Zuerst wird Bedingung (`x >= 0`) überprüft und erst *nachher* wird der Codeblock (`print(x), x = x - 1`) ausgeführt. |
| + | * Assemblercode: Genau anders herum. Zuerst wird Codeblock (`OUT, SUB ONE`) ausgeführt und erst nachher wird die Bedingung (Akkumulator $\geq 0$) überprüft und gegebenenfalls nach oben gesprungen. | ||
| - | **Ziel:** Die Benutzerin soll nacheinander zwei Zahlen eingeben. Diese werden | + | 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 BRP LOOP // springe zum Codeblock des Loops | ||
| + | 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 | ||
| + | </ | ||
| - | 1) Programmiere das Programm zuerst mit Python. Dabei dürfen nur die mathematischen Operationen $+$ und $-$ verwendet werden. | + | Eine weitere Lösung: |
| + | < | ||
| + | LDA START | ||
| + | LOOP OUT | ||
| + | BRZ END | ||
| + | SUB ONE | ||
| + | BRA LOOP | ||
| + | END HLT | ||
| + | START DAT 10 | ||
| + | ONE | ||
| + | </ | ||
| - | 2) Mache einen Plan: Wie kannst du das Programm mit dem LMC schreiben? | + | ++++ |
| - | 3) Implementiere es mit dem LMC. | ||
| + | ==== Aufgabe D2: Maximum ==== | ||
| - | ==== Aufgabe D3: Maximum ==== | + | **Ziel:** Die Benutzerin soll nacheinander zwei Zahlen eingeben. Es soll dann die grössere der beiden Zahlen ermittelt und ausgegeben werden. |
| - | Die Benutzerin soll nacheinander zwei Zahlen eingeben. Es soll dann die grössere der beiden Zahlen ermittelt und ausgegeben werden. | + | 1) Programmiere das Programm zuerst mit Python. Verwende dazu eine if-else-Verzweigung. |
| - | ===== Lösungen ===== | + | ++++Lösung| |
| - | <nodisp 2> | + | <code python> |
| - | ++++Lösungen| | + | a = input() |
| + | b = input() | ||
| - | == Multiplikation == | + | if b > a: |
| + | print(b) | ||
| + | else: | ||
| + | print(a) | ||
| + | </ | ||
| + | |||
| + | Alternativ (besser für LMC) | ||
| <code python> | <code python> | ||
| a = input() | a = input() | ||
| b = input() | b = input() | ||
| - | r = 0 # result | ||
| - | while a > 0: | + | if b - a > 0: |
| - | | + | |
| - | a = a - 1 | + | else: |
| + | | ||
| + | </ | ||
| - | print(r) | + | ++++ |
| + | |||
| + | 2) Mache einen Plan: Wie kannst du das Programm mit dem LMC schreiben? | ||
| + | |||
| + | 3) Implementiere es mit dem LMC. | ||
| + | |||
| + | |||
| + | |||
| + | ==== Aufgabe D3: 3er-Reihe ==== | ||
| + | |||
| + | **Ziel:** Der Benutzer soll eine Zahl $n$ eingeben. Es werden dann die ersten $n$ Zahlen der 3-er Reihe ausgegeben: $3, | ||
| + | |||
| + | 1) Programmiere das Programm zuerst mit Python. Dabei dürfen nur die mathematischen Operationen $+$ und $-$ verwendet werden. | ||
| + | |||
| + | ++++Lösung| | ||
| + | |||
| + | <code python> | ||
| + | n = input() | ||
| + | |||
| + | x = 3 | ||
| + | while n > 0: | ||
| + | | ||
| + | x = x + 3 | ||
| + | n = n - 1 | ||
| </ | </ | ||
| + | |||
| + | ++++ | ||
| + | |||
| + | 2) Mache einen Plan: Wie kannst du das Programm mit dem LMC schreiben? | ||
| + | |||
| + | 3) Implementiere es mit dem LMC. | ||
| + | |||
| + | |||
| + | |||
| + | ===== Lösungen ===== | ||
| + | |||
| + | <nodisp 1> | ||
| + | ++++Lösungen| | ||
| + | |||
| + | == Maximum == | ||
| < | < | ||
| Zeile 134: | Zeile 206: | ||
| INP | INP | ||
| STO B | STO B | ||
| - | JUP LDA A | + | |
| - | BRZ FINE | + | |
| - | | + | LDA A |
| - | STA A | + | |
| - | | + | |
| - | | + | |
| - | STA R | + | |
| - | BRA JUP | + | |
| - | FINE | + | |
| OUT | OUT | ||
| HLT | HLT | ||
| - | ONE DAT 1 | + | ELSE LDA B |
| + | OUT | ||
| + | HLT | ||
| A DAT 0 | A DAT 0 | ||
| B DAT 0 | B DAT 0 | ||
| - | R DAT 0 | ||
| </ | </ | ||
| + | |||
| + | == 3er-Reihe == | ||
| + | |||
| + | < | ||
| + | INP | ||
| + | STO N | ||
| + | LOOP LDA N | ||
| + | BRZ END // jump to end if N=0 | ||
| + | SUB ONE | ||
| + | STO N | ||
| + | LDA X | ||
| + | OUT | ||
| + | ADD STEP | ||
| + | STO X | ||
| + | BRA LOOP | ||
| + | END HLT | ||
| + | N DAT 0 | ||
| + | X DAT 3 | ||
| + | STEP DAT 3 | ||
| + | ONE DAT 1 | ||
| + | </ | ||
| + | |||
| ++++ | ++++ | ||
| </ | </ | ||