beginner_de
beginner_de
beginner_de
Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.
YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.
Avr-Asm-Tutorial S. 121<br />
; +----+<br />
; | R1 | Eingabezahl, im Beispiel $FF<br />
; | FF |<br />
; +----+<br />
; +----+----+----+<br />
; | R4 | R3 | R2 | Multiplikant 502 = $00 01 F6<br />
; | 00 | 01 | F6 |<br />
; +----+----+----+<br />
;<br />
;<br />
; +----+----+----+<br />
; | R7 | R6 | R5 | Resultat, im Beispiel 128.010<br />
; | 01 | F4 | 0A |<br />
; +----+----+----+<br />
fpconv8m:<br />
clr R4 ; Setze <strong>de</strong>n Multiplikant auf 502<br />
ldi rmp,$01<br />
mov R3,rmp<br />
ldi rmp,$F6<br />
mov R2,rmp<br />
clr R7 ; leere Ergebnisregister<br />
clr R6<br />
clr R5<br />
fpconv8m1:<br />
or r1,R1 ; Prüfe ob noch Bits 1 sind<br />
brne fpconv8m2 ; Noch Einsen, mach weiter<br />
ret ; fertig, kehre zurück<br />
fpconv8m2:<br />
lsr R1 ; Schiebe Zahl nach rechts (teilen durch 2)<br />
brcc fpconv8m3 ; Wenn das niedrigste Bit eine 0 war, dann überspringe <strong>de</strong>n<br />
Additionsschritt<br />
add R5,R2 ; Addiere die Zahl in R4:R3:R2 zum Ergebnis<br />
adc R6,R3<br />
adc R7,R4<br />
fpconv8m3:<br />
lsl R2 ; Multipliziere R4:R3:R2 mit 2<br />
rol R3<br />
rol R4<br />
rjmp fpconv8m1 ; Wie<strong>de</strong>rhole für das nächste Bit<br />
; Run<strong>de</strong> die Zahl in R7:R6 mit <strong>de</strong>m Wert von Bit 7 von R5<br />
fpconv8r:<br />
clr rmp ; Null nach rmp<br />
lsl R5 ; Rotiere Bit 7 ins Carry<br />
adc R6,rmp ; Addiere LSB mit Übertrag<br />
adc R7,rmp ; Addiere MSB mit Übertrag<br />
mov R2,R7 ; Kopiere <strong>de</strong>n Wert nach R2:R1 (durch 256 teilen)<br />
mov R1,R6<br />
ret<br />
; Wandle das Wort in R2:R1 in einen ASCII-Text in R5:R6:R7:R8<br />
; +----+----+<br />
; + R2 | R1 | Eingangswert 0..500<br />
; +----+----+<br />
; +----+----+<br />
; | R4 | R3 | Dezimalteiler<br />
; +----+----+<br />
; +----+----+----+----+<br />
; | R5 | R6 | R7 | R8 | Ergebnistext (für Eingangswert 500)<br />
; | '5'| '.'| '0'| '0'|<br />
; +----+----+----+----+<br />
fpconv8a:<br />
clr R4 ; Setze Dezimalteiler auf 100<br />
ldi rmp,100<br />
mov R3,rmp<br />
rcall fpconv8d ; Hole ASCII-Ziffer durch wie<strong>de</strong>rholtes Abziehen<br />
mov R5,rmp ; Setze Hun<strong>de</strong>rter Zeichen<br />
ldi rmp,10 ; Setze Dezimalteiler auf 10