In een appnote van atmel heb ik een aantal voorbeeldcodes gevonden om te delen en te vermenigvuldigen.

Maar ik vrees dat de code fout is want als ik die simuleer werkt het niet ;)


	
;***************************************************************************
;*
;* "div16u" - 16/16 Bit Unsigned Division
;*
;* This subroutine divides the two 16-bit numbers 
;* "dd8uH:dd8uL" (dividend) and "dv16uH:dv16uL" (divisor). 
;* The result is placed in "dres16uH:dres16uL" and the remainder in
;* "drem16uH:drem16uL".
;*  
;* Number of words	:19
;* Number of cycles	:235/251 (Min/Max)
;* Low registers used	:2 (drem16uL,drem16uH)
;* High registers used  :5 (dres16uL/dd16uL,dres16uH/dd16uH,dv16uL,dv16uH,
;*			    dcnt16u)
;*
;***************************************************************************

;***** Subroutine Register Variables

.def	drem16uL=r14
.def	drem16uH=r15
.def	dres16uL=r16
.def	dres16uH=r17
.def	dd16uL	=r16
.def	dd16uH	=r17
.def	dv16uL	=r18
.def	dv16uH	=r19
.def	dcnt16u	=r20

;***** Code

div16u:	clr	drem16uL	;clear remainder Low byte
	sub	drem16uH,drem16uH;clear remainder High byte and carry
	ldi	dcnt16u,17	;init loop counter
d16u_1:	rol	dd16uL		;shift left dividend
	rol	dd16uH
	dec	dcnt16u		;decrement counter
	brne	d16u_2		;if done
	ret			;    return
d16u_2:	rol	drem16uL	;shift dividend into remainder
	rol	drem16uH
	sub	drem16uL,dv16uL	;remainder = remainder - divisor
	sbc	drem16uH,dv16uH	;
	brcc	d16u_3		;if result negative
	add	drem16uL,dv16uL	;    restore remainder
	adc	drem16uH,dv16uH
	clc			;    clear carry to be shifted into result
	rjmp	d16u_1		;else
d16u_3:	sec			;    set carry to be shifted into result
	rjmp	d16u_1
	
	

in de code is ook niets terug te vinden van dres16uL of dres16uH .. ;) ( heeft dezelfde registers in gebruik als dd16uL en dd16uH zie ik net met mijn dwaze kop :( )

de vraag is hoe moet het wel :D

oja nog een vraagje, als ik met interrupts werk, moet ik dan mijn sreg ff op de stack gooien en na de interrupt terug plaatsen?

shit wat ben ik slecht :D

het kwam dus doordat ik registers heb aangepast en niet doorgehad dat een paar register aliasen dezelfde reg gebruiken :)

ok dus rest er nog de vraag over die SREG tijdes een interrupt

http://www.circuitsonline.net/images/f_edit.gif

[Bericht gewijzigd door Evil Aedolon op ]

Op 20 juli 2004 16:09:03 schreef Koen Van Vlaenderen:
shit wat ben ik slecht :D

het kwam dus doordat ik registers heb aangepast en niet doorgehad dat een paar register aliasen dezelfde reg gebruiken :)

ok dus rest er nog de vraag over die SREG tijdes een interrupt

Die sla ik altijd op. Als er bijvoorbeeld tijdens een vergelijking een interrupt komt en die is afgehandeld is het status register veranderd. Dan kan de instructie die een actie onderneemt aan de hand van de vergelijking niet altijd het goede doen.