Hier noch eine sehr effiziente Divisionsroutine für zwei 16-Bit-Werte.
Sie braucht nur 7 Register und 18 Instruktionen.
Ausserdem berechnet sie auch den Rest der Division.
Code:
; Input
; r25:r24 = Zähler
; r23:r22 = Nenner
; Output
; r25:r24 = Quotient
; r27:r26 = Rest
; Verwendete Register:
; r21-r27
div16:
; Ergebnis auf 0, Carry löschen
clr r26
sub r27, r27
; 17 Bits werden rotiert (16 Bits-Wert und Carry)
ldi r21, 17
rjmp div16_start
div16_loop:
; Zähler nach links rotieren (Bits kommen aus r25:r24)
rol r26
rol r27
; Vergleich gegen Nenner
cp r26, r22
cpc r27, r23
brcs div16_start
; Abziehen, wenn kleinergleich
sub r26, r22
sbc r27, r23
div16_start:
; Hier entsteht das Komplement des Ergebnisses
; C=0: es wurde abgezogen
; C=1: es wirde nicht abgezogen
rol r24
rol r25
dec r21
brne div16_loop
; fertig
; Bits des Ergebnis müssen noch invertiert werden
com r24
com r25
ret
Die Routine ist von avr-gcc.
Lesezeichen