PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : unsignierte Wordzahlen dividieren



Holger
20.10.2006, 21:47
Hab da lange nach gesucht, bin auch fündig geworden bei Andreas Roth "Das große Mikrocontroller-Applikations-Kochbuch".
Allerdins ist das ne ziemlich lange Routine (in Assembler). Aber scheinbar geht es nicht anders, als "zu Fuß", oder weiß jemand ne schnellere Lösung?
Aber bitte nicht in Hochsprachen, Assembler needs.;)

edgar
20.10.2006, 22:03
Hallo Holger,

wie gehts? wenn Du rechnen moechtest,dann schau in die code library von www.8052.com (http://www.8052.com/) rein. Dort findest Du eine praktische Sammlung mit kompakten Routinen. Der Roth ist da etwas 'deutschkompliziert'

32 bit / 16bit oder 16bit / 16bit...unsigned.
Ultrakurz gibt es leider nicht,da der Kaefer nur 8 bits hat :)

Du berechnest bestimmt die Steuern....den REST nicht vergessen.

Ciao
:)

Winne
20.10.2006, 22:04
Sukzessive Approximation+ Umkehrfunktion:

Rekursiv multiplizieren und betragsmäßige Abweichungen vergleichen. Abbruch bei Erreichen des Minimums.

edgar
20.10.2006, 22:19
Einen supergruss an Winne !

:)

Peter Dannegger
21.10.2006, 00:17
Hab da lange nach gesucht, bin auch fündig geworden bei Andreas Roth "Das große Mikrocontroller-Applikations-Kochbuch".
Allerdins ist das ne ziemlich lange Routine (in Assembler).

Wie lang ist die denn ?

Hier ist eine auf Geschwindigkeit optimiert:



;************************************************* ***********************
;* *
;* Unsigned division 16 bit *
;* *
;* r6,r7 / r4,r5 = r6,r7 *
;* r6,r7 % r4,r5 = r4,r5 *
;* *
;************************************************* ***********************

udiv16:
cjne r4, #0 _udi5

mov a, r5 ; 16 / 8 bit
mov r3, a
mov b, a
mov a, r6
div ab
mov r6, a
mov r5, b
mov r4, #8
_dik5: mov a, r7
add a, r7
mov r7, a
mov a, r5
rlc a
mov r5, a
jbc cy, _dik6
subb a, r3
jnc _dik7
djnz r4, _dik5
ret
_dik6: subb a, r3
_dik7: mov r5, a
inc r7
djnz r4, _dik5
ret



_udi5: clr a ; 16 / 16 bit
xch a, r4
mov r3, a
mov r2, #8
_dik2: mov a, r7
add a, r7
mov r7, a
mov a, r6
rlc a
mov r6, a
mov a, r4
rlc a
mov r4, a
mov a, r6
subb a, r5
mov a, r4
subb a, r3
jc _dik3
mov r4, a
mov a, r6
subb a, r5
mov r6, a
inc r7
_dik3: djnz r2, _dik2
clr a
xch a, r6
mov r5, a
ret


Auf Größe optimiert wärs etwa die Hälfte.


Peter

Holger
21.10.2006, 07:04
Hi,
bei Roth habe ich 40 Zeilen Assemblercode. Werde mir aber mal Peter's Code in aller Ruhe reinziehen. In einem Fall muss ich nur durch eine Halfword teilen. Da hab ich ja was am WoEnde zu tun! (Gähn.....:))

Winne
21.10.2006, 16:14
noch einfacher :

Schleife mit Zähler
Zu Null den Divisor sooft addieren bis das Ergebnis größer als der Dividend ist Zählerstand auslesen um eins vermindern . Den Rest ermittelst du in dem du den Divisor vom letzten Zwischenergebnis sutrahierst,und dieses seinerseits vom Dividenden.