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