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.
Die Routine ist von avr-gcc.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







Zitieren

Lesezeichen