Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- .include "m32def.inc"
- .cseg
- .org 0x0000 ; Platziert das Programm ab Adresse 0x0000 im Programm-speicher
- ldi r17,low(RAMEND) ; Low Stackpointer und
- out spl,r17
- ldi r17,high(RAMEND) ; High Stackpointer auf
- out sph,r17 ; Ende des SRAMs setzen
- ldi r26,$10 ; Zeiger auf Ende des Ausgabestrings
- ldi r27,$02
- rcall ausgabe_loeschen
- ;-----------------------------------------------------------
- ; Eingabe für die Konvertierung
- ldi r16,188 ; Unteres Bytes der Dezimalzahl
- ldi r17,154 ; oberes Byte der Dezimalzahl
- ldi r18,10 ; Basis
- ldi r19,0
- ;-----------------------------------------------------------
- ; Konvertierung der Eingabe nach dem Horner-Schema
- ldi r24,0
- horner:
- rcall div_16
- rcall ausgabe_ziffer
- mov r16,r20
- mov r17,r21
- cp r20,r24
- cpc r21,r24
- brne horner
- end:
- rjmp end ; Endlosschleife am Programmende
- ;-----------------------------------------------------------
- ; Routinen zur 8- und 16-Bit Division
- div_8:
- ; Vorzeichenlose 8-Bit Division
- ; Eingabe: r16 - Dividend; r18 - Divisor
- ; Ausgabe: r16 - Teilungsrest; r20 - Ergebnis
- ldi r20,0
- ldi r22,1 ; Hilfswert
- loop_8:
- cp r16,r18
- brlo less8
- sub r16,r18
- add r20,r22
- rjmp loop_8
- less8:
- ret
- div_16:
- ; Vorzeichenlose 16-Bit Division
- ; Eingabe: <r17,r16> - Dividend; <r19,r18> - Divisor
- ; Ausgabe: <r17,r16> - Teilungsrest; <r21,r20> - Ergebnis
- ldi r20,0
- ldi r21,0
- ldi r22,1 ; Hilfswert
- ldi r23,0
- loop_16:
- cp r16,r18
- cpc r17,r19
- brlo less16
- sub r16,r18
- sbc r17,r19
- add r20,r22
- adc r21,r23
- rjmp loop_16
- less16:
- ret
- ;-----------------------------------------------------------
- ; Vorgegebene Routinen zur Initialisierung und Ausgabe
- ausgabe_ziffer:
- ; Wandelt die Binärziffer in r16 in eine ASCII-Ziffer [0-9][A-F]
- ; und schreibt diese in den Speicher, auf den das X-Register zeigt
- ; Eingabe: <r16> - Binärziffer, <r27,r26> - Speicheradresse
- ; Ausgabe: <r27,r26> - nächste Speicheradresse
- cpi r16,0x0a ; Hex-Ziffer?
- brsh hex
- ldi r31,0x30 ; Offset für ASCII Konvertierung in [0-9]
- rjmp write
- hex:
- ldi r31,0x37 ; Offset für ASCII Konvertierung in [A-F]
- write:
- add r16,r31 ; Umwandlung in ASCII
- st -X,r16 ; Ziffer in den Speicher schreiben
- ret
- ausgabe_loeschen:
- ; Füllt das Feld für die Ausgabe mit Leerzeichen
- ; Eingabe: <r27,r26> - Speicheradresse der Ausgabe
- ; Ausgabe: -
- push r26 ; ursprünglichen Registerinhalt auf dem Stack sichern
- push r27
- ldi r31,0x20 ; 0x20 = Leerzeichen
- ldi r30,0x10 ; Schleifenvariable r30 = 16 Durchläufe
- loeschen:
- st -X,r31
- dec r30
- brne loeschen
- pop r27 ; Registerinhalt wiederherstellen
- pop r26
- ret
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement