; Div8 dividiert eine 16-Bit-Zahl durch eine 8-Bit-Zahl ; Test: 16-Bit-Zahl: 0xAAAA, 8-Bit-Zahl: 0x55 ; .NOLIST .INCLUDE "C:\avrtools\appnotes\8515def.inc" .LIST ; ; Registers ; .DEF rd1l = R0 ; LSB Divident .DEF rd1h = R1 ; MSB Divident .DEF rd1u = R2 ; Hifsregister .DEF rd2 = R3 ; Divisor .DEF rel = R4 ; LSB Ergebnis .DEF reh = R5 ; MSB Ergebnis .DEF rmp = R16; Hilfsregister zum Laden ; .CSEG .ORG 0 ; rjmp start ; start: ; ; Vorbelegen mit den Testzahlen ; ldi rmp,0xAA ; 0xAAAA in Divident mov rd1h,rmp mov rd1l,rmp ldi rmp,0x55 ; 0x55 in Divisor mov rd2,rmp ; ; Divieren von rd1h:rd1l durch rd2 ; div8: clr rd1u ; Leere Hilfsregister clr reh ; Leere Ergebnisregister clr rel ; (Ergebnisregister dient auch als inc rel ; Zähler bis 16! Bit 1 auf 1 setzen) ; ; Hier beginnt die Divisionsschleife ; div8a: clc ; Carry-Bit leeren rol rd1l ; nächsthöheres Bit des Dividenten rol rd1h ; in das Hilfsregister rotieren rol rd1u ; (entspricht Multipliklation mit 2) brcs div8b ; Eine 1 ist herausgerollt, ziehe ab cp rd1u,rd2 ; Divisionsergebnis 1 oder 0? brcs div8c ; Überspringe Subtraktion, wenn kleiner div8b: sub rd1u,rd2; Subtrahiere Divisor sec ; Setze carry-bit, Ergebnis ist eine 1 rjmp div8d ; zum Schieben des Ergebnisses div8c: clc ; Lösche carry-bit, Ergebnis ist eine 0 div8d: rol rel ; Rotiere carry-bit in das Ergebnis rol reh brcc div8a ; solange Nullen aus dem Ergebnis ; rotieren: weitermachen ; Ende der Division erreicht stop: rjmp stop ; Endlosschleife