Pfad: Home =>
AVR-Übersicht =>
Binäres Rechnen => Division
Assembler Quellcode der Division
; 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
©2002 by http://www.avr-asm-tutorial.net