Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.

Link zu der Vergleichsansicht

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] scagf_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: Mache einen Plan, wie du das mit dem LMC umsetzen willst. Welchen der drei Branch-Befehle verwendest du?
  
 ++++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:
 {{ :gf_informatik:computerarchitektur_sca:lmc_countdown_output.png?nolink&100 |}} {{ :gf_informatik:computerarchitektur_sca:lmc_countdown_output.png?nolink&100 |}}
 +
 +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 `<Befehl> LOOP` können wir nun jederzeit zu dieser Zeile Code springen, auch wenn sich ihre Position verschiebt. Anstelle von `LOOP` kann man natürlich jedes beliebige Wort verwenden. 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 `<Befehl> LOOP` können wir nun jederzeit zu dieser Zeile Code springen, auch wenn sich ihre Position verschiebt. Anstelle von `LOOP` kann man natürlich jedes beliebige Wort verwenden.
  
-Implementiere dies in deinem Code.+Implementiere dies in deinem Code. Screenshot in Dokumentation einfügen.
  
 ++++Lösung| ++++Lösung|
  
 <code> <code>
-        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
 </code> </code>
  
-+++++Der grosse Unterschied in der Logik zwischen dem Python- und Assemblercode ist:
  
-==== Aufgabe D2Multiplikation ====+   * Python: Zuerst wird Bedingung (`x >0`) überprüft und erst *nachher* wird der Codeblock (`print(x), x x - 1`) ausgeführt. 
 +   * AssemblercodeGenau 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 eingebenDiese werden dann multipliziert. Das Resultat wird ausgegeben und gespeichert.+Man kann seinen Assemblercode aber auch so schreiben, dass er näher an der Logik des Python-Codes istAllerdings wird er dann etwas komplizierter: 
 +<code> 
 +        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 
 +</code>
  
-1) Programmiere das Programm zuerst mit Python. Dabei dürfen nur die mathematischen Operationen $+$ und $-$ verwendet werden.+Eine weitere Lösung: 
 +<code> 
 +        LDA START 
 +LOOP    OUT 
 +        BRZ END 
 +        SUB ONE 
 +        BRA LOOP 
 +END     HLT 
 +START   DAT 10 
 +ONE     DAT 1 
 +</code>
  
-2) Mache einen Plan: Wie kannst du das Programm mit dem LMC schreiben?+++++
  
-3) Implementiere es mit dem LMC. 
  
 +==== Aufgabe D2: Maximum ====
  
-==== Aufgabe D3Maximum ====+**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 eingebenEs soll dann die grössere der beiden Zahlen ermittelt und ausgegeben werden.+1) Programmiere das Programm zuerst mit PythonVerwende 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) 
 +</code> 
 + 
 +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: 
-    r = r + +    print(b
-    a = a - 1+else: 
 +    print(a
 +</code>
  
-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,6,9,\ldots$. 
 + 
 +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: 
 +    print(x) 
 +    x = x + 3 
 +    n = n - 1
 </code> </code>
 +
 +++++
 +
 +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 ==
  
 <code> <code>
Zeile 134: Zeile 206:
         INP         INP
         STO B         STO B
-JUP     LDA A +        SUB A 
-        BRZ FINE +        BRP ELSE 
-        SUB ONE +        LDA A
-        STA +
-        LDA R +
-        ADD B +
-        STA R +
-        BRA JUP +
-FINE    LDA R+
         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 
 </code> </code>
 +
 +== 3er-Reihe ==
 +
 +<code>
 +        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
 +</code>
 +
  
 ++++ ++++
  
 </nodisp> </nodisp>
  • gf_informatik/computerarchitektur_sca/aufgaben_d.1692914397.txt.gz
  • Zuletzt geändert: 2023-08-24 21:59
  • von sca