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 08:40]
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 7: Line 7:
   * Memory mapped output: Die Bytes 232-255 werden als Buchstaben (entsprechend dem ASCII-Code) in der Ausgabe dargestellt.   * Memory mapped output: Die Bytes 232-255 werden als Buchstaben (entsprechend dem ASCII-Code) in der Ausgabe dargestellt.
   * Die Bytes 253-255 werden zusätzlich in der Siebensegmentanzeige dargestellt. Die Segmente sind von oben im Uhrzeigersinn nummeriert (Bits 0 bis 5), mit dem inneren Segment mit Nummer 6.   * Die Bytes 253-255 werden zusätzlich in der Siebensegmentanzeige dargestellt. Die Segmente sind von oben im Uhrzeigersinn nummeriert (Bits 0 bis 5), mit dem inneren Segment mit Nummer 6.
 +
 +
 +  * Simulator: https://fginfo.ksbg.ch/~ivo/assembler-simulator/
  
 **Ausgabe auf die 7-Segment Anzeige** **Ausgabe auf die 7-Segment Anzeige**
Line 29: Line 32:
 </code> </code>
  
 +<WRAP todo>
 +Produzieren Sie die Ausgabe 'abcdefghijklmnopqrstuvwx'
 +</WRAP>
 **Subroutine, Parameter in Registern** **Subroutine, Parameter in Registern**
  
Line 83: Line 89:
  
 </code> </code>
-====== Assembler ====== 
-  * Simulator: https://fginfo.ksbg.ch/~ivo/assembler-simulator/ 
  
 +<WRAP todo>
 +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>
 +
 +**Verzweigungen (if, else)**
 +<code asm>
 + MOV A, 42      ; 1st value to compare
 + MOV B, 23      ; 2nd value to compare
 + CMP A,B        ; Compare (subtraction, sets Z,C flags)
 + JB less        ; Carry flag set? then it's less
 + JE equal       ; Zero flag set, then it's equal
 + MOV [232],'>'  ; Not jumped, so it's greater 
 + JMP endif      ; Jump to 'after if'
 +less:
 + MOV [232],'<'
 + JMP endif
 +equal:
 + MOV [232],'='
 +
 +endif:
 + HLT
 +
 +</code>
 +<WRAP todo>
 +Schreiben Sie eine oder mehrere Subroutinen, die ein Byte als zweistellige Hexadezimalzahl in die Ausgabe schreibt (0-padded). Verwenden Sie dafür bitweise logische Operationen.
 +</WRAP>
 +
 +**Arrays**
 +Studieren Sie folgenden Sortier-Algorithmus:
 +<code asm>
 + JMP start
 +arrayStart:
 +        DB 's'
 +        DB 'y'
 +        DB 'i'
 +        DB 'b'
 +        DB 'p'
 +        DB 'o'
 +
 +
 +start: ; copy to output aerea
 + MOV A, arrayStart
 + MOV B, 232
 +copyLoop:
 + MOV C,[A]
 + MOV [B],C
 + INC A
 + INC B
 + CMP A,start
 + JNE copyLoop
 +
 +; Write len variable, setup start address
 + MOV A, start
 + MOV B, arrayStart
 + SUB A,B
 + ADD A,232
 + MOV [last], A
 + MOV A, 232
 +; Start sorting
 +loopA:
 + MOV B,A
 +loopB:
 + INC B
 + CMP B,[last]
 + JNC nextA
 + MOV C,[A]
 + MOV D,[B]
 + CMP C,D
 + JBE loopB
 + MOV [A],D
 + MOV [B],C
 + JMP loopB
 +nextA:
 + INC A
 + CMP A,[last]
 + JB loopA
 + HLT
 +last:
 + DB 0
 +</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 =====
 +  * Studieren Sie den Code.
 +  * Ä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>
 +; Dieses Programm gibt den String rechtsbündig ab 
 +; Adresse 250 aus.
 +;
 + JMP start
 + DB "hello world"
 +;
 +; Register
 +; A Ausgabe-Adresse
 +; B Position in DB
 +; C temporär
 +
 +start: MOV A,250 ; Adresse Ausgabe (letzter Buchstabe)
 + MOV B, start    ; Adresse+1 vom letzten Buchstaben
 + DEC B ; B vermindern
 + CALL ausgabe
 + HLT
 +ausgabe:
 + MOV C,[B] ; Buchstabe in C
 + MOV [A],C ; Ausgabe
 + DEC A ; A vermindern
 + DEC B ; B vermindern
 + CMP B,1 ; ist B am Anfang angekommen?
 + JNE ausgabe ; sonst wiederholen
 + RET
 +</code>
 +<hidden Hinweise>
 +Welcher für die Programmausführung wichtiger Bereich wird bei zu langem String überschrieben?
 +<hidden weitere Hinweise>
 +Finden Sie eine Eingabe so, dass die Rücksprungadresse manipuliert wird (z.B. Rücksprung auf start).
 +<hidden noch mehr Hinweise>
 +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>
 +Mit Rücksprung direkt in die DB-Konstante (Adresse 0x02)
 +<code asm>
 +DB "ý8þ?ÿ8+       Hello World!"
 +</code>
 +Oder mit Rücksprung in die kopierten Daten an der Adresse 0xdc (was realistischer ist, wenn der String eine Eingabe sein soll):
 +<code asm>
 +DB "ý8þ?ÿ8+Ü       Hello World!"
 +</code>
 +
 +</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.1712040052.txt.gz
  • Last modified: 2024/04/02 08:40
  • by Ivo Blöchliger