<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stefan09</id>
	<title>Mikrocontroller.net - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://www.mikrocontroller.net/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Stefan09"/>
	<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/articles/Spezial:Beitr%C3%A4ge/Stefan09"/>
	<updated>2026-04-10T11:42:46Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.39.7</generator>
	<entry>
		<id>https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=46656</id>
		<title>AVR Arithmetik</title>
		<link rel="alternate" type="text/html" href="https://www.mikrocontroller.net/index.php?title=AVR_Arithmetik&amp;diff=46656"/>
		<updated>2010-04-27T06:35:17Z</updated>

		<summary type="html">&lt;p&gt;Stefan09: /* 32 Bit / 32 Bit */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Dieser Artikel beschäftigt sich mit 16- und 32-Bit Arithmetik auf [[AVR]]-Controllern. Für detailierte Ausführungen zur [[AVR-Tutorial: Arithmetik8|8-Bit Arithmetik auf AVR]] gibt es eine Seite im [[AVR-Tutorial]].&lt;br /&gt;
&lt;br /&gt;
== Vergleich ==&lt;br /&gt;
&lt;br /&gt;
===16 Bit ===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17 &amp;gt; mit &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit ===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; Vergleiche &amp;lt; r16, r17, r18, r19 &amp;gt; mit &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    cp    r16, r20&lt;br /&gt;
    cpc   r17, r21&lt;br /&gt;
    cpc   r18, r22&lt;br /&gt;
    cpc   r19, r23&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Addition==&lt;br /&gt;
===16 Bit + 16 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; + &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit + 32 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; + &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    add   r16, r20&lt;br /&gt;
    adc   r17, r21&lt;br /&gt;
    adc   r18, r22&lt;br /&gt;
    adc   r19, r23&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Subtraktion==&lt;br /&gt;
===16 Bit - 16 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17 &amp;gt; = &amp;lt; r16, r17 &amp;gt; - &amp;lt; r20, r21 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===32 Bit - 32 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
    ; &amp;lt; r16, r17, r18, r19 &amp;gt; = &amp;lt; r16, r17, r18, r19 &amp;gt; - &amp;lt; r20, r21, r22, r23 &amp;gt;&lt;br /&gt;
    ;&lt;br /&gt;
&lt;br /&gt;
    sub   r16, r20&lt;br /&gt;
    sbc   r17, r21&lt;br /&gt;
    sbc   r18, r22&lt;br /&gt;
    sbc   r19, r23&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Division==&lt;br /&gt;
===32 Bit / 32 Bit===&lt;br /&gt;
&lt;br /&gt;
Ergebnis gerundet, und mit Restbildung.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	t4	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
; a3..0 = a3..0 / b3..0&lt;br /&gt;
; b3..0 = remainde&lt;br /&gt;
&lt;br /&gt;
;cycle: max 684&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	clr	t2&lt;br /&gt;
	clr	t3&lt;br /&gt;
	ldi	t4, 32&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t0&lt;br /&gt;
	rol	t1&lt;br /&gt;
	rol	t2&lt;br /&gt;
	rol	t3&lt;br /&gt;
	cp	t0, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	cpc	t2, b2&lt;br /&gt;
	cpc	t3, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	t0, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	sbc	t2, b2&lt;br /&gt;
	sbc	t3, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t4&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	mov	b2, t2&lt;br /&gt;
	mov	b3, t3&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Eine Version, die je nach konkreten Zahlen Rechenzeit einspart&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned rounded division 32 bit                *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
&lt;br /&gt;
urdiv32:&lt;br /&gt;
	mov	t0, b0		;T = B&lt;br /&gt;
	mov	t1, b1&lt;br /&gt;
	mov	t2, b2&lt;br /&gt;
	mov	t3, b3&lt;br /&gt;
	lsr	t3		;B / 2&lt;br /&gt;
	ror	t2&lt;br /&gt;
	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	add	a0, t0		;A = A + B / 2&lt;br /&gt;
	adc	a1, t1&lt;br /&gt;
	adc	a2, t2&lt;br /&gt;
	adc	a3, t3&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned division 32 bit                        *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 431 (63%) (684)&lt;br /&gt;
&lt;br /&gt;
udiv32:&lt;br /&gt;
	clr	t1&lt;br /&gt;
	tst	b3&lt;br /&gt;
	breq	udi10&lt;br /&gt;
	ldi	t0, 8&lt;br /&gt;
udi1:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	cp	a1, b0&lt;br /&gt;
	cpc	a2, b1&lt;br /&gt;
	cpc	a3, b2&lt;br /&gt;
	cpc	t1, b3&lt;br /&gt;
	brcs	udi2&lt;br /&gt;
	sub	a1, b0&lt;br /&gt;
	sbc	a2, b1&lt;br /&gt;
	sbc	a3, b2&lt;br /&gt;
	sbc	t1, b3&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi2:	dec	t0&lt;br /&gt;
	brne	udi1&lt;br /&gt;
	mov	b0, a1&lt;br /&gt;
	clr	a1&lt;br /&gt;
	mov	b1, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b2, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b3, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi10:	tst	b2&lt;br /&gt;
	breq	udi20&lt;br /&gt;
	ldi	t0, 16&lt;br /&gt;
udi11:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi12&lt;br /&gt;
	cp	a2, b0&lt;br /&gt;
	cpc	a3, b1&lt;br /&gt;
	cpc	t1, b2&lt;br /&gt;
	brcs	udi13&lt;br /&gt;
udi12:	sub	a2, b0&lt;br /&gt;
	sbc	a3, b1&lt;br /&gt;
	sbc	t1, b2&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi13:	dec	t0&lt;br /&gt;
	brne	udi11&lt;br /&gt;
	mov	b0, a2&lt;br /&gt;
	clr	a2&lt;br /&gt;
	mov	b1, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b2, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi20:	tst	b1&lt;br /&gt;
	breq	udi30&lt;br /&gt;
	ldi	t0, 24&lt;br /&gt;
udi21:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi22&lt;br /&gt;
	cp	a3, b0&lt;br /&gt;
	cpc	t1, b1&lt;br /&gt;
	brcs	udi23&lt;br /&gt;
udi22:	sub	a3, b0&lt;br /&gt;
	sbc	t1, b1&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi23:	dec	t0&lt;br /&gt;
	brne	udi21&lt;br /&gt;
	mov	b0, a3&lt;br /&gt;
	clr	a3&lt;br /&gt;
	mov	b1, t1&lt;br /&gt;
	ret&lt;br /&gt;
&lt;br /&gt;
udi30:	ldi	t0, 32&lt;br /&gt;
udi31:	lsl	a0&lt;br /&gt;
	rol	a1&lt;br /&gt;
	rol	a2&lt;br /&gt;
	rol	a3&lt;br /&gt;
	rol	t1&lt;br /&gt;
	brcs	udi32&lt;br /&gt;
	cp	t1, b0&lt;br /&gt;
	brcs	udi33&lt;br /&gt;
udi32:	sub	t1, b0&lt;br /&gt;
	inc	a0&lt;br /&gt;
udi33:	dec	t0&lt;br /&gt;
	brne	udi31&lt;br /&gt;
	mov	b0, t1			;store remainder&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Multiplikation==&lt;br /&gt;
===32 Bit * 16 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
.def	a0	= r16&lt;br /&gt;
.def	a1	= r17&lt;br /&gt;
.def	a2	= r18&lt;br /&gt;
.def	a3	= r19&lt;br /&gt;
&lt;br /&gt;
.def	b0	= r20&lt;br /&gt;
.def	b1	= r21&lt;br /&gt;
.def	b2	= r22&lt;br /&gt;
.def	b3	= r23&lt;br /&gt;
&lt;br /&gt;
.def	t0	= r24&lt;br /&gt;
.def	t1	= r25&lt;br /&gt;
.def	t2	= r26&lt;br /&gt;
.def	t3	= r27&lt;br /&gt;
.def	i0	= r28&lt;br /&gt;
&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;*                      unsigned multiplication 32 bit                  *&lt;br /&gt;
;*                                                                      *&lt;br /&gt;
;************************************************************************&lt;br /&gt;
;cycle: max 245&lt;br /&gt;
&lt;br /&gt;
umul32:&lt;br /&gt;
	cpi	a3, 0&lt;br /&gt;
	cpc	a3, a2&lt;br /&gt;
	breq	_umu1		;one operand must be below 65536&lt;br /&gt;
	mov	t0, a0		; swap A &amp;lt;-&amp;gt; B&lt;br /&gt;
	mov	a0, b0&lt;br /&gt;
	mov	b0, t0&lt;br /&gt;
	mov	t0, a1&lt;br /&gt;
	mov	a1, b1&lt;br /&gt;
	mov	b1, t0&lt;br /&gt;
	mov	b2, a2&lt;br /&gt;
	mov	b3, a3&lt;br /&gt;
	clr	a2&lt;br /&gt;
	clr	a3&lt;br /&gt;
;				a3,2,1,0 = a1,0 * b3,2,1,0&lt;br /&gt;
_umu1:	ldi	i0, 16&lt;br /&gt;
	clr	t0&lt;br /&gt;
	clr	t1&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
_umu2:	brcc	_umu3&lt;br /&gt;
	add	a2, b0&lt;br /&gt;
	adc	a3, b1&lt;br /&gt;
	adc	t0, b2&lt;br /&gt;
	adc	t1, b3&lt;br /&gt;
_umu3:	ror	t1&lt;br /&gt;
	ror	t0&lt;br /&gt;
	ror	a3&lt;br /&gt;
	ror	a2&lt;br /&gt;
	ror	a1&lt;br /&gt;
	ror	a0&lt;br /&gt;
	dec	i0&lt;br /&gt;
	brne	_umu2&lt;br /&gt;
	ret&lt;br /&gt;
;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===24 Bit * 24 Bit===&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
;&lt;br /&gt;
;  muls24x24_48:&lt;br /&gt;
;  Signed Multiply von 2 24Bit breiten Zahlen mit 48Bit ergebnis&lt;br /&gt;
;&lt;br /&gt;
;  x                       = a           * b&lt;br /&gt;
;  R21:R20:R19:R18:R17:R16 = R27:R26:R25 * R24:R23:R22&lt;br /&gt;
;  hi                  lo    hi      lo    hi      lo&lt;br /&gt;
;&lt;br /&gt;
;**********************************************************************************************&lt;br /&gt;
&lt;br /&gt;
muls24x24_48:&lt;br /&gt;
    clr    r2          ;Zero Register&lt;br /&gt;
    muls  r27,r24        ; (1) signed Multiply a(MSB) * b(MSB)&lt;br /&gt;
    mov    r21,r1&lt;br /&gt;
    mov    r20,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r23        ; (2) unsigned&lt;br /&gt;
    mov    r18,r0&lt;br /&gt;
    mov    r19,r1&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r22        ; (3) unsigned multiply a(LSB) * b(LSB)&lt;br /&gt;
    mov    r17,r1&lt;br /&gt;
    mov    r16,r0&lt;br /&gt;
&lt;br /&gt;
    mul    r26,r22        ;(4) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mul    r25,r23        ;(5) unsigned&lt;br /&gt;
    add    r17,r0&lt;br /&gt;
    adc    r18,r1&lt;br /&gt;
    adc    r19,r2&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    push  r16&lt;br /&gt;
    push  r17&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r27&lt;br /&gt;
    mulsu  r16,r22        ;(6) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mulsu  r16,r23        ;(7) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r16,r24&lt;br /&gt;
    mov    r17,r25&lt;br /&gt;
    mulsu  r16,r17        ;(8) unsigned * signed&lt;br /&gt;
    sbc    r20,r2&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r18,r0&lt;br /&gt;
    adc    r19,r1&lt;br /&gt;
    adc    r20,r2&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    mov    r17,r26&lt;br /&gt;
    mulsu  r16,r17        ;(9) unsigned * signed&lt;br /&gt;
    sbc    r21,r2&lt;br /&gt;
    add    r19,r0&lt;br /&gt;
    adc    r20,r1&lt;br /&gt;
    adc    r21,r2&lt;br /&gt;
&lt;br /&gt;
    pop    r17&lt;br /&gt;
    pop    r16&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Wurzel==&lt;br /&gt;
===sqrt (32 Bit)===&lt;br /&gt;
&lt;br /&gt;
Dieser Algorithmus beruht auf dem Zusammenhang&lt;br /&gt;
:&amp;lt;math&amp;gt; n^2 = \sum_{k=1}^n (2k-1) = 1+3+5+\cdots+2n-1&amp;lt;/math&amp;gt;&lt;br /&gt;
Er zählt, wie viele ungerade Zahlen vom Radikand abgezogen werden können, bevor dieser kleiner Null wird. Dementsprechend viele Schleifendurchläufe werden für die Wurzelberechnung benötigt; für die Quadratwurzel von 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; also zum Beispiel 10000 Stück.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
; WURZEL 32Bit&lt;br /&gt;
;	04/2006&lt;br /&gt;
; Bernhard.Erfurt@gmx.de&lt;br /&gt;
&lt;br /&gt;
; ATmega8&lt;br /&gt;
.include &amp;quot;m8def.inc&amp;quot;&lt;br /&gt;
&lt;br /&gt;
.def temp   = R16       ; TEMP&lt;br /&gt;
.def temp1  = R17       ; TEMP1&lt;br /&gt;
.def temp2  = R18       ; TEMP2&lt;br /&gt;
.def temp3  = R19       ; TEMP3&lt;br /&gt;
.def temp4  = R20       ; TEMP4&lt;br /&gt;
&lt;br /&gt;
;STACK initialisieren&lt;br /&gt;
    ldi   temp, HIGH(RAMEND)&lt;br /&gt;
    out   SPH, temp&lt;br /&gt;
    ldi   temp, LOW(RAMEND)&lt;br /&gt;
    out   SPL, temp&lt;br /&gt;
&lt;br /&gt;
LOOP:&lt;br /&gt;
&lt;br /&gt;
; TESTZAHLEN&lt;br /&gt;
    ldi   temp1, BYTE1(10000)&lt;br /&gt;
    ldi   temp2, BYTE2(10000)&lt;br /&gt;
    ldi   temp3, BYTE3(10000)&lt;br /&gt;
    ldi   temp4, BYTE4(10000)&lt;br /&gt;
; WURZEL berechnen&lt;br /&gt;
    rcall WURZEL_32            ; INP: TEMP1...4 OUT: TEMP1...2&lt;br /&gt;
    nop&lt;br /&gt;
    rjmp  LOOP&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
;#######################################################################&lt;br /&gt;
;&lt;br /&gt;
;		INPUT 	temp1  (LOW)&lt;br /&gt;
;		INPUT 	temp2&lt;br /&gt;
;		INPUT 	temp3&lt;br /&gt;
;		INPUT 	temp4  (HIGH)&lt;br /&gt;
;&lt;br /&gt;
;		OUTPUT 	temp1 (LOW)&lt;br /&gt;
;		OUTPUT 	temp2 (HIGH)&lt;br /&gt;
;&lt;br /&gt;
;		Hilfsregister: R0,R1,R14,R15,R16,R21,R22,R23,R24&lt;br /&gt;
;&lt;br /&gt;
; 	rcall WURZEL_32		; INP: TEMP1...4 OUT: TEMP1...2&lt;br /&gt;
;&lt;br /&gt;
WURZEL_32:&lt;br /&gt;
; HILFSREGISTER sichern	(STACK)&lt;br /&gt;
    push  R0&lt;br /&gt;
    push  R1&lt;br /&gt;
    push  R14&lt;br /&gt;
    push  R15&lt;br /&gt;
    push  R16&lt;br /&gt;
    push  R21&lt;br /&gt;
    push  R22&lt;br /&gt;
    push  R23&lt;br /&gt;
    push  R24&lt;br /&gt;
; HILFSREGISTER initialisieren&lt;br /&gt;
    ldi   temp, 1&lt;br /&gt;
    mov   R14, temp		;= 1&lt;br /&gt;
    ldi   temp, 2&lt;br /&gt;
    mov   R15, temp		;= 2&lt;br /&gt;
    clr   temp&lt;br /&gt;
    clr   r0          	; ERGEBNIS&lt;br /&gt;
    clr   r1 &lt;br /&gt;
    ldi   r21,1        	;= 1&lt;br /&gt;
    clr   r22 &lt;br /&gt;
    clr   r23 &lt;br /&gt;
    clr   r24 &lt;br /&gt;
&lt;br /&gt;
; Wurzel-Berechnung&lt;br /&gt;
WURZEL_32_w:&lt;br /&gt;
    sub   temp1,R21 	; SUBTRAKTION&lt;br /&gt;
    sbc   temp2,R22 &lt;br /&gt;
    sbc   temp3,R23 &lt;br /&gt;
    sbc   temp4,R24 &lt;br /&gt;
    brlo  WURZEL_32_ww&lt;br /&gt;
    add   R0,R14 		; ADDITION +1(Ergebnis)&lt;br /&gt;
    adc   R1,temp &lt;br /&gt;
    add   R21,R15 		; ADDITION +2&lt;br /&gt;
    adc   R22,temp &lt;br /&gt;
    adc   R23,temp &lt;br /&gt;
    adc   R24,temp &lt;br /&gt;
    rjmp  WURZEL_32_w&lt;br /&gt;
WURZEL_32_ww:   &lt;br /&gt;
    mov   temp1,r0 		; ERGEBNIS KOPIEREN&lt;br /&gt;
    mov   temp2,r1 &lt;br /&gt;
; HILFSREGISTER wieder herstellen (STACK)&lt;br /&gt;
    pop   R24&lt;br /&gt;
    pop   R23&lt;br /&gt;
    pop   R22&lt;br /&gt;
    pop   R21&lt;br /&gt;
    pop   R16&lt;br /&gt;
    pop   R15&lt;br /&gt;
    pop   R14&lt;br /&gt;
    pop   R1&lt;br /&gt;
    pop   R0&lt;br /&gt;
    ret&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== avr-gcc Implementierung (32 Bit) ===&lt;br /&gt;
Quadratwurzel basierend auf einer Implementierung von Ruud v Gessel&amp;lt;ref&amp;gt;[http://members.chello.nl/j.beentjes3/Ruud/sqrt32avr.htm Ruud v Gessel: Quadratwurzeln]&amp;lt;/ref&amp;gt;, die zusammen mit avr-gcc verwendet werden kann. Je nach Algorithmus wird das  Ergebnis zum Nächsten gerundet oder abgerundet. Abrunden ist dann angesagt, wenn die Wurzel aus einer großen Eingabe wie &amp;lt;tt&amp;gt;0xffffffff&amp;lt;/tt&amp;gt; zu ziehen ist, da bei Aufrunden hier das Ergebnis zu 0 überläuft.&lt;br /&gt;
&lt;br /&gt;
Die maximale Ausführungszeit ist maximal 310 Ticks (inclusive CALL+RET):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;sqrt32.h&amp;lt;/b&amp;gt;&lt;br /&gt;
&amp;lt;c&amp;gt;&lt;br /&gt;
#ifndef SQRT32_H&lt;br /&gt;
#define SQRT32_H&lt;br /&gt;
#include &amp;lt;stdint.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
extern uint16_t sqrt32_round (uint32_t);&lt;br /&gt;
extern uint16_t sqrt32_floor (uint32_t);&lt;br /&gt;
&lt;br /&gt;
#endif /* SQRT32_H */&lt;br /&gt;
&amp;lt;/c&amp;gt;&lt;br /&gt;
&lt;br /&gt;
C-Module, welche die Wurzel benötigen, includen einfach diesen Header. Das Assembler-Modul wird assembliert und zum Projekt hinzugelinkt.&lt;br /&gt;
&lt;br /&gt;
==== Rundung zum Nächsten ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Rundung zum Nächsten&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 82 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 265&amp;amp;ndash;310 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_round)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
; Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
; R25:R24 = SQRT (R25:R24:R23:R22) rounded to the &lt;br /&gt;
; nearest integer (0.5 rounds up)&lt;br /&gt;
; Destroys R18-R19,R22-R23,R26-R27&lt;br /&gt;
; Cycles incl call &amp;amp; ret = 265-310&lt;br /&gt;
; Stack incl call = 2-3&lt;br /&gt;
;-----------------------------------------------------------&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_round&lt;br /&gt;
.type sqrt32_round, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_round:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18          ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26     ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f           ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27     ; Does test value fit?&lt;br /&gt;
    brcs  3f           ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19     ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18          ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18     ; Shift right only test bit in result&lt;br /&gt;
    rol   R22          ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0       ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b           ; Develop 15 bits of the sqrt&lt;br /&gt;
    brcs  4f           ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; Test for last bit 1&lt;br /&gt;
    brcc  5f           ; NC --&amp;gt; bit is 0&lt;br /&gt;
4:  sbc   R23, R19     ; Subtract C (any value from 1 to 0x7f will do)&lt;br /&gt;
    sbc   R24, R26&lt;br /&gt;
    sbc   R25, R27     ; Update argument for test&lt;br /&gt;
    inc   R26          ; Last bit is 1&lt;br /&gt;
5:  lsl   R23          ; Only bit 7 matters&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25          ; Remainder * 2 + C&lt;br /&gt;
    brcs  6f           ; C --&amp;gt; Always round up&lt;br /&gt;
    cp    R26, R24&lt;br /&gt;
    cpc   R27, R25     ; C decides rounding&lt;br /&gt;
6:  adc   R26, R19&lt;br /&gt;
    adc   R27, R19     ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27     ; return in R25:R24 for avr-gcc ABI compliance&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_round, .-sqrt32_round&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==== Abrunden ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;center&amp;gt;&lt;br /&gt;
{| {{Tabelle}}&lt;br /&gt;
|+ &#039;&#039;&#039;Ressourcen-Verbrauch, Abrunden&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Flash&#039;&#039;&#039;    || 60 Bytes&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;RAM&#039;&#039;&#039;      || 2&amp;amp;ndash;3 Bytes dynamisch, 0 Bytes statisch&lt;br /&gt;
|-&lt;br /&gt;
|bgcolor=&amp;quot;#ddffdd&amp;quot;| &#039;&#039;&#039;Laufzeit&#039;&#039;&#039; || 260&amp;amp;ndash;300 Ticks (inclusive Zeiten für CALL+RET)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/center&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;sqrt32.S&#039;&#039;&#039; (sqrt32_floor)&lt;br /&gt;
{{Scrollbox|25em|&lt;br /&gt;
&amp;lt;avrasm&amp;gt;&lt;br /&gt;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;&lt;br /&gt;
;  Fast and short 32 bits AVR sqrt routine, avr-gcc ABI compliant&lt;br /&gt;
;  R25:R24 = SQRT (R25:R24:R23:R22) &lt;br /&gt;
;  rounded down to integer&lt;br /&gt;
;     Destroys R26,R27,R22,R23,R18,R19&lt;br /&gt;
;  Cycles incl call &amp;amp; ret = 260-300&lt;br /&gt;
;  Stack incl call = 2-3&lt;br /&gt;
.text&lt;br /&gt;
.global sqrt32_floor&lt;br /&gt;
.type sqrt32_floor, @function&lt;br /&gt;
&lt;br /&gt;
sqrt32_floor:&lt;br /&gt;
    ldi   R19, 0xc0&lt;br /&gt;
    clr   R18               ; rotation mask in R19:R18&lt;br /&gt;
    ldi   R27, 0x40&lt;br /&gt;
    sub   R26, R26          ; developing sqrt in R27:R26, C=0&lt;br /&gt;
1:  brcs  2f                ; C --&amp;gt; Bit is always 1&lt;br /&gt;
    cp    R24, R26&lt;br /&gt;
    cpc   R25, R27          ; Does test value fit?&lt;br /&gt;
    brcs  3f                ; C --&amp;gt; nope, bit is 0&lt;br /&gt;
2:  sub   R24, R26&lt;br /&gt;
    sbc   R25, R27          ; Adjust argument for next bit&lt;br /&gt;
    or    R26, R18&lt;br /&gt;
    or    R27, R19          ; Set bit to 1&lt;br /&gt;
3:  lsr   R19&lt;br /&gt;
    ror   R18               ; Shift right mask, C --&amp;gt; end loop&lt;br /&gt;
    eor   R27, R19&lt;br /&gt;
    eor   R26, R18          ; Shift right only test bit in result&lt;br /&gt;
    rol   R22               ; Bit 0 only set if end of loop&lt;br /&gt;
    rol   R23&lt;br /&gt;
    rol   R24&lt;br /&gt;
    rol   R25               ; Shift left remaining argument (C used at 1:)&lt;br /&gt;
    sbrs  R22, 0            ; Skip if 15 bits developed&lt;br /&gt;
    rjmp  1b                ; Develop 15 bits of the sqrt&lt;br /&gt;
&lt;br /&gt;
    brcs  4f                ; C--&amp;gt; Last bits always 1&lt;br /&gt;
    lsl   R23               ; Need bit 7 in C for cpc&lt;br /&gt;
    cpc   R26, R24&lt;br /&gt;
    cpc   R27, R25          ; After this C is last bit&lt;br /&gt;
&lt;br /&gt;
4:  adc   R26, R19          ; Round up if C (R19=0)&lt;br /&gt;
    mov   R25, R27          ; return in R25:R24 as for avr-gcc ABI&lt;br /&gt;
    mov   R24, R26&lt;br /&gt;
    ret&lt;br /&gt;
&lt;br /&gt;
.size sqrt32_floor, .-sqrt32_floor&lt;br /&gt;
&amp;lt;/avrasm&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
=== Schnelle Implementierung für große Operanden=== &lt;br /&gt;
* http://www.mikrocontroller.net/topic/98432&lt;br /&gt;
&lt;br /&gt;
==Binär zu BCD - Umwandlung==&lt;br /&gt;
Zur Ausgabe einer Binärzahl auf ein Textdisplay oder zur seriellen ASCII-Übertragung an den PC ist diese Umwandlung nötig. Sie ist ähnlich aufwendig wie eine Division, zum Beispiel für eine 32-Bit-Zahl etwa 500-900 Taktzyklen und 10 Register.&lt;br /&gt;
Mehrere Verfahren werden angeboten:&lt;br /&gt;
=== Division /10===&lt;br /&gt;
Für eine Division pro Dezimalstelle ist nur ein Unterprogramm nötig. Der Divisionsrest, engl. remainder, bildet unmittelbar die BCD-codierte Dezimalziffer, von rechts nach links fortschreitend. Zur Ausgabe von links nach rechts kann man die Ziffern auf dem Stack zwischenlagern (LIFO-Register last-in first-out)&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics, 8-Bit Binary to 2-digit BCD Conversion]&lt;br /&gt;
&lt;br /&gt;
===Division /10000, /1000, /100, /10===&lt;br /&gt;
ähnlich dem vorigen, aber die BCD-Ziffern erscheinen sofort von links nach rechts.&lt;br /&gt;
&lt;br /&gt;
Beispiele:&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin2BCD == 16-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
&lt;br /&gt;
===Addition von $33===&lt;br /&gt;
Hier wird die Binärzahl, mit der höchstwertigen Stelle voran, von rechts in die Ergebnisregister geschoben. Nach jedem Schiebevorgang wird eine Korrekturrechnung ausgeführt. Für 32 Bit bilden 4 Eingabe- und 5 Ausgaberegister ein 72 Bit Schieberegister, das 32 mal links geschoben wird.&lt;br /&gt;
Durch die Korrekturrechnung wird die Binärzahl zur gepackten (2 Stellen pro Byte) BCD-Zahl &amp;quot;aufgebläht&amp;quot;. &lt;br /&gt;
&lt;br /&gt;
Eine Erklärung des Algorithmus soll hier versucht werden: &lt;br /&gt;
Um die niederwertigste 4 Bit Binärziffer in BCD umzuwandeln, ist für $0...$9 keine Änderung nötig, für $A...$F wird &amp;quot;6&amp;quot; addiert. Diese Addition wird ersetzt durch eine Addition von &amp;quot;3&amp;quot; und anschließendes Linksschieben. Das führt man zunächst für beide Halbbytes gleichzeitig mit &amp;quot;subi Reg,-$33&amp;quot; aus. Anschließend werden die beiden Additionen einzeln für den Fall &amp;quot;0...9&amp;quot; rückgängig gemacht. Die Bits 4 und 7 des Registers dient dabei als BCD-Carry-Flag (Halbbyte-Übertrag). Das normale C-Flag wird durch die Additionen nicht beeinflußt, es dient nur dem Schiebevorgang.&lt;br /&gt;
&lt;br /&gt;
Beispiele: &lt;br /&gt;
*[http://www.atmel.com/dyn/resources/prod_documents/doc0938.pdf AVR204: BCD Arithmetics 16 Bit Binary to 5-digit BCD conversion]&lt;br /&gt;
*[http://users.i.com.ua/~birua/math32.asm Bin4BCD == 32-bit Binary to BCD conversion in der Macrolibrary Math32 von Andre Birua]&lt;br /&gt;
*[http://www.xilinx.com/support/documentation/application_notes/xapp029.pdf Der gleiche serielle Algorithmus für Xilinx CPLDs]&lt;br /&gt;
&lt;br /&gt;
===Tabelle===&lt;br /&gt;
Für kleine Zahlen kann die gesuchte BCD-Zahl auch aus einer Tabelle entnommen werden.&lt;br /&gt;
===Mischvarianten===&lt;br /&gt;
Eine Mischung mehrerer Verfahren wird z.&amp;amp;nbsp;B. von Andre Birua in der ersten Variante von &amp;quot;Bin4BCD&amp;quot; verwendet. Die oberen 16 Bit werden nach &amp;quot;Div/10000&amp;quot; vorbearbeitet und anschließend alle 32 Bit nach &amp;quot;Add $33&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
===Tutorial===&lt;br /&gt;
*[http://www.cs.uiowa.edu/~jones/bcd/decimal.html Part of  the Arithmetic Tutorial Collection by Douglas W. Jones] &lt;br /&gt;
enthält C-Code und PIC-Code für schnelle 16 Bit Wandlung, Hardware-Multiplizierer möglich - auch für FPGA interessant&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/TTL74185 VHDL Nachbau des TTL 74185 6-Bit Binär-zu-BCD-Wandlers]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/Festkommaarithmetik Tutorial Festkommaarithmetik]&lt;br /&gt;
*[http://www.mikrocontroller.net/articles/AVR-Tutorial:_7-Segment-Anzeige  Tutorial 7-Segment-Anzeige]&lt;br /&gt;
&lt;br /&gt;
===Diskussionsbeiträge im Forum===&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/85248 Binär-zu-BCD in VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/83884 ebenfalls VHDL]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/59851 32 Bit in C]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/64842 16 und 32 Bit C und AVR-Assembler]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/1501 Assembler für AVR-GCC bis 256 Bit]&lt;br /&gt;
*[http://www.mikrocontroller.net/topic/173633 2 hoch x , wenn x kein Integer ist]&lt;br /&gt;
&lt;br /&gt;
== Sinus und Cosinus ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (CORDIC)]]&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Sinus und Cosinus (Lineare Interpolation)]]&lt;br /&gt;
&lt;br /&gt;
== Saturierung ==&lt;br /&gt;
&amp;amp;rarr; siehe [[AVR Arithmetik/Saturierung]]&lt;br /&gt;
&lt;br /&gt;
== Fußnoten ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Weblinks==&lt;br /&gt;
* [http://www.azillionmonkeys.com/qed/sqroot.html Wurzelfunktion]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=37150&amp;amp;start=40 Optimierte Division durch 10]&lt;br /&gt;
* [http://www.avrfreaks.net/index.php?name=PNphpBB2&amp;amp;file=printview&amp;amp;t=54192&amp;amp;start=20 Optimierte Division durch 3]&lt;br /&gt;
* [http://www.cs.uiowa.edu/~jones/bcd/divide.html Division durch reziproke Multiplikation, Tutorial]&lt;br /&gt;
* [http://users.i.com.ua/~birua/math32.html Math32: Some Useful Assembler Multibyte Maths  Subroutines &amp;amp; Macrocalls] [http://avr-asm.tripod.com/math32x.html (oder hier)]&lt;br /&gt;
*[http://avr.15.forumer.com/a/computer-math-11/ AVR-Computer Math topics]&lt;br /&gt;
*[http://elm-chan.org/cc_e.html Elm-Chan&#039;s Bibliotheken u.a. Arithmetik]&lt;br /&gt;
* [http://www.embedded.com/design/opensource/217900224?printable=true Multiplication by a Fixed Point Constant], Embedded.com, 06/16/09&lt;br /&gt;
* [http://surfnet.dl.sourceforge.net/sourceforge/avrfix/avrfix.pdf M. Rosenblattl, A. Wolf: &#039;&#039;Fixed Point Library According to ISO/IEC Standard DTR 18037 for Atmel AVR Processors&#039;&#039;] (pdf, engl., 133 S.)&lt;br /&gt;
* [http://www.open-std.org/JTC1/sc22/wg14/www/docs/n1005.pdf ISO/IEC DTR 18037] (pdf, engl., 101 S.) &amp;amp;mdash; Spezifikation einer Erweiterung von C99 zur Unterstützung von Embedded Systems &lt;br /&gt;
&lt;br /&gt;
[[Category:AVR]]&lt;br /&gt;
[[Category:AVR-Tutorial]]&lt;br /&gt;
[[Category:AVR-Arithmetik| ]]&lt;/div&gt;</summary>
		<author><name>Stefan09</name></author>
	</entry>
</feed>