lehrkraefte:blc:informatik:efi-2023:assembler

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
lehrkraefte:blc:informatik:efi-2023:assembler [2024/04/02 10:28]
Ivo Blöchliger [Funktionsweise einer CPU]
lehrkraefte:blc:informatik:efi-2023:assembler [2024/04/23 15:04] (current)
Ivo Blöchliger [Funktionsweise einer CPU]
Line 32: Line 32:
 </code> </code>
  
 +<WRAP todo>
 +Produzieren Sie die Ausgabe 'abcdefghijklmnopqrstuvwx'
 +</WRAP>
 **Subroutine, Parameter in Registern** **Subroutine, Parameter in Registern**
  
Line 89: Line 92:
 <WRAP todo> <WRAP todo>
 Unter Verwendung der obigen Beispiele und subroutinen, schreiben Sie ein Programm, das ein Byte dezimal in die Ausgabe schreibt. Unter Verwendung der obigen Beispiele und subroutinen, schreiben Sie ein Programm, das ein Byte dezimal in die Ausgabe schreibt.
 +
 +<hidden Lösungsvorschlag>
 +<code asm>
 + MOV A, 237
 + MOV C,232
 + CALL showByte
 + HLT
 +
 +; Byte in A
 +; Address in C
 +showByte:
 + PUSH A   ; Save registers
 + PUSH B
 + PUSH C
 + ADD C,2
 +loopA:
 + PUSH A   ; SAVE A
 + PUSH 10  ; Push modulo op to stack
 + CALL mod
 + INC SP   ; Correct Stackpointer
 + MOV B,A  ; digit to B
 + CALL showDigit 
 + DEC C  ; Adjust for next address
 + POP A  ; restore A
 + DIV 10
 + JNZ loopA
 + POP C
 + POP B
 + POP A
 + RET
 +
 +</code>
 +</hidden>
 </WRAP> </WRAP>
  
Line 168: Line 204:
 </code> </code>
  
 +**Ziffern auf 7-Segment-Anzeige**
 +<WRAP todo>
 +Mit Hilfe eines Arrays, schreiben Sie eine subroutine, die eine Ziffer auf der 7-Segment-Anzeige ausgibt.
 +
 +Zusatz: Geben Sie ein Byte auf der 7-Segmentanzeige dezimal aus.
 +
 +Bonus: Implementieren Sie QuickSort.
 +
 +<hidden Animationen auf 7-Segment-Anzeige>
 +<code asm>
 +; Simple example
 +; Writes Hello World to the output
 +
 +start:
 +
 + MOV B, dataStart
 +loop:
 + MOV A, 253
 + MOV C, [B]
 + MOV [A], C
 + MOV C, [B+1]
 + MOV [A+1], C
 + MOV C, [B+2]
 + MOV [A+2], C
 + ADD B, 3
 + CMP B, dataEnd
 + JNZ loop
 + JMP start
 +
 +
 +
 +dataStart:
 + DB 8
 + DB 8
 + DB 8
 +
 + DB 0
 + DB 8
 + DB 12
 +
 + DB 0
 + DB 0
 + DB 14
 +
 + DB 0
 + DB 0
 + DB 7
 +
 + DB 0
 + DB 1
 + DB 3
 +
 + DB 1
 + DB 1
 + DB 1
 +
 + DB 33
 + DB 1
 + DB 0
 +
 + DB 49
 + DB 0
 + DB 0
 +
 + DB 56
 + DB 0
 + DB 0
 +
 + DB 24
 + DB 8
 + DB 0
 +
 +dataEnd:
 +</code>
 +</hidden>
 +<hidden Animation mit Bytes in Strings codier (unnötig hackisch)>
 +<code asm>
 +start:
 +
 + MOV B, dataStart
 +loop:
 + MOV C, [B]
 + MOV A, [B+6]
 + MOV [253], C
 + MOV [254], A
 + MOV [255], C
 + INC B
 + CMP B, dataEnd
 + JNZ loop
 + JMP start
 +
 +
 +
 +dataStart: 
 + DB "!0␌"
 +
 +dataEnd:
 + DB "!␌0"
 +</code>
 +</hidden>
 +
 +
 +
 +
 +<hidden Quicksort-Implementation>
 +<code asm>
 + JMP start
 +arrayStart:
 +        DB 4
 + DB 2
 + DB 7
 + DB 9
 + DB 8
 + DB 7
 + DB 4
 + DB 5
 + DB 8
 + DB 9
 + DB 4
 + DB 3
 + DB 6
 + DB 1
 + 
 +
 +start:
 + MOV A, arrayStart
 + MOV B, start
 + DEC B
 + call quicksort
 + HLT
 +
 +
 +quicksort:
 +;first elements address in A
 +;last elements address in B
 + PUSH D
 + PUSH C
 + PUSH B
 + PUSH A
 + MOV C,B
 + SUB C,A
 + JBE ende    ; bail if B-A <= 0
 + MOV [a0], A   ; save bounds
 + MOV [b0], B
 + MOV C, [A]    ; Pivot value
 + INC A
 +leftloop:  ; while C>=[A]: A++
 + CMP C,[A]
 + JC rightloop   ; break if C<[A]
 + INC A
 + CMP A,B
 + JBE leftloop   ; repeat if A<=B
 +
 +rightloop:   ; while C<=[B]; B--
 + CMP C,[B]
 + JA swapping   ; break if C>[B]
 + DEC B
 + CMP A,B
 + JB rightloop  ; repeat if A<B
 +
 +swapping:   ; Swaps [A] and [B], if A<B
 + CMP A,B
 + JAE setpivot
 + MOV D, [A]
 + PUSH D
 + MOV D, [B]
 + MOV [A], D
 + POP D
 + MOV [B], D
 + INC A
 + DEC B
 + JMP leftloop
 +
 +setpivot:
 + CMP A,[b0]
 + JBE ok
 + MOV A,[b0]
 + INC A
 +ok:    ; swap pivot and [A]
 + DEC A
 + MOV [p0], A   ; index of pivot
 + MOV D,[A]
 + MOV [A], C
 + MOV C,[a0]
 + MOV [C], D
 +;recursion
 + MOV A, [a0]
 + MOV B, [p0]
 + DEC B
 + PUSH [p0]   ; save p0 and b0
 + PUSH [b0]
 + call quicksort
 + POP B       ; restore p0 and b0
 + POP A
 + INC A
 + call quicksort
 +ende:
 + POP A
 + POP B
 + POP C
 + POP C
 + RET
 +
 +
 +a0: DB 0
 +b0: DB 0
 +p0: DB 0
 +
 +</code>
 +</hidden>
 +</WRAP>
 ===== Hackme ===== ===== Hackme =====
   * Studieren Sie den Code.   * Studieren Sie den Code.
-  * Ändern Sie den String in der DB Zeile, so, dass LOL in der 7-Segment Anzeige ausgegeben wird. (Das Programm sonst darf nicht verändert werden!)+  * Ändern Sie den String in der DB Zeile, so, dass ''L O L'' in der 7-Segment Anzeige ausgegeben wird. (Das Programm sonst darf nicht verändert werden!)
 <code asm> <code asm>
 ; Dieses Programm gibt den String rechtsbündig ab  ; Dieses Programm gibt den String rechtsbündig ab 
Line 203: Line 450:
 <hidden noch mehr Hinweise> <hidden noch mehr Hinweise>
 Platzieren Sie den gewünschten Assemblercode im String und setzen Sie die Rücksprungadresse darauf. Platzieren Sie den gewünschten Assemblercode im String und setzen Sie die Rücksprungadresse darauf.
 +<hidden Ausgabe vom Assemblercode als String>
 +<code asm>
 +lol:
 +MOV [253], 0111000b
 +MOV [254], 0111111b
 +MOV [255], 0111000b
 +
 +fertig:
 + mov A, fertig
 + dec A
 + mov B, 246
 +loop:
 + mov C, [A]
 + mov [B], C
 + dec B
 + dec A
 + JNC loop
 + hlt
 +
 +</code>
 <hidden mögliche Lösungen> <hidden mögliche Lösungen>
 Mit Rücksprung direkt in die DB-Konstante (Adresse 0x02) Mit Rücksprung direkt in die DB-Konstante (Adresse 0x02)
Line 212: Line 479:
 DB "ý8þ?ÿ8+Ü       Hello World!" DB "ý8þ?ÿ8+Ü       Hello World!"
 </code> </code>
- 
  
 </hidden> </hidden>
Line 218: Line 484:
 </hidden> </hidden>
 </hidden> </hidden>
 +</hidden>
 +
 +
 +
 +===== Mögliche Prüfungsfragen =====
 +Die Ausgabe auf die drei 7-Segment Anzeigen erfolgt auf die Adressen 253 bis 255.
 +
 +Die Bits auf der Anzeige sind wie folgt nummeriert:
 +<code txt>
 ++--0--+
 +5     1
 +:--6--:
 +4     2
 ++--3--+
 +</code>
  
  • lehrkraefte/blc/informatik/efi-2023/assembler.1712046491.txt.gz
  • Last modified: 2024/04/02 10:28
  • by Ivo Blöchliger