Division durch Zehnerpotenz in Assembler

Gast #1321881
Lesenswert?

Hi.

Ich habe hier einen PIC12 dem ich ein wenig rechnen beibringen will. Die 
16x16 Bit Multiplikation klappt schon ganz gut. Jetzt soll er jedoch 
auch Dividieren lernen und zwar durch 100 und 1000. Gibts da ne einfache 
Möglichkeit, ohne ne richtige Divisionsroutine, durch solche 10er 
Potenzen zu teilen ?

Gruß Jens
Gast #1321930
Lesenswert?

Danke euch für die Antworten!

@A. K.
nee der PIC12 kann garnet multiplizieren...:P (zumindest mit hausmitteln 
net)

@Christoph Kessler
Hilft mir leider auch nicht weiter. Ich brauchs nicht für ne Ausgabe ich 
muss ne neue Zahl ausrechnen (und die dann in nem counter einstellen) 
und da ich keine Gleitkommarechnung benutzen kann, muss ich mit 5612 
statt 5,612 multiplizieren und anschließend halt durch 1000 dividieren 
(mit Rundung).

Der PIC hat leider kaum Spiecher und den könnt ich besser gebrauchen als 
für ne Divisionsroutine, hab gedacht villeicht gibts ja n Trick wie man 
ne Division durch 1000 einfach machen kann.

Gruß
#1321944
Lesenswert?

Jens87 schrieb:
> Ich habe hier einen PIC12 dem ich ein wenig rechnen beibringen will. Die
> 16x16 Bit Multiplikation klappt schon ganz gut. Jetzt soll er jedoch
> auch Dividieren lernen und zwar durch 100 und 1000. Gibts da ne einfache
> Möglichkeit, ohne ne richtige Divisionsroutine, durch solche 10er
> Potenzen zu teilen ?

Was stört Dich an einer Divisionsroutine?
Die verbraucht doch nur ein einziges mal Flash, egal, wie oft sie 
aufgerufen wird.

Mit dem PIC kenne ich mich nicht aus, aber beim AVR braucht eine 16Bit 
Division 20 Worte Flash, ist also nicht der Rede wert.

Wenn es aber um die Dezimalausgabe geht, kann man das auch direkt nach 
der Subtraktionsmethode machen, geht deutlich schneller.
16 Bit nach 5 Digits wandeln kostet beim AVR auch nur 20 Worte Flash.


Es bleibt natürlich Dir überlassen, aber ich persöhnlich finde das 
Programmieren eines 6-, 8-, 14-, 20-, 28-Pin AVR deutlich entspannter, 
gegenüber einem PIC12.
Wobei ich sogar die 8-Pinner fast nur noch in C programmiere und dann 
auch float kein Problem ist.


Peter
#1321966
Lesenswert?

Hallo,

Ich weiß nicht, wie genau Du es brauchst, aber 5612 / 1000 entspricht 
(fast) 5480 / 1024. Genaugenommen 5480,47.

5480 / 1024 = 1370 / 256

Also 16bit-Multiplikation mit 1370 und dann nur das höherwertige Byte 
nehmen.
Evtl kann man dann noch jedes Zweite mal noch eins draufaddieren oder 
so.

Hoffe, geholfen zu haben,
Konrad
#1322306
Lesenswert?

Wenns einfach in ASM sein soll, dann muss in 2-er Potenzen gedacht 
werden. Also shift, add, sub. Das ist ledignlich eine Verallgemeinerung 
des Beitrages von Konrad.
Also mit 10 multiplizieren is dasselbe wie originalwert 3x rechts 
shiften (*8) und noch zwei mal drauf addieren. Bringt bei den meisten 
Architekturen nur Verzoegerung wenn ordentlich MULs da sind doch bei 
Minimalbefehlssaetzen ist das der Weg. Eine tolle Zahlen fuers 
Multiplizieren und Addieren ist 256, wie bereits erwaehnt, dann wird das 
low-byte zum high-byte oder andersrum.

Vielleicht hilfts ja.
#1322346
Lesenswert?

Konrad L. schrieb:
> Also 16bit-Multiplikation mit 1370 und dann nur das höherwertige Byte
> nehmen.

Was soll das bringen?
Diese 16 Bit Multiplikation funktioniert doch nur bis Zahlen kleiner 
65536/1370=47, dürfte also praktisch unsinnig sein.


Nehmen wir mal an, die Division kostet 150% gegenüber dem AVR, also 30 
Worte.
Ist der PIC12 denn wirklich so klein, daß popelige 30 Worte ne Rolle 
spielen?


Peter
Gast #1322582
Lesenswert?

Moin, moin,

Fixed-Point arithmetik heißt das Zauberwort, wurde aber eh schon zuvor 
von Konrad und Robert geschrieben. Anstatt mit 1000 nimmst 1024, das 
enspricht 10Bit, oder 10x rechts schieben. Dazu gibts hervorragende App. 
notes bei Microchip die allesamt eine Bibliothek - in Assemblercode - 
mitbringen.
Da braucht man nix mehr selber machen, es sei denn wegen Geschwindigkeit 
die Routinen anzupassen, was schätzungsweise <10% bringt.

@Peter: Diese kleinen PIC's sind recht schnell am Anschlag, ein 
Vergleich mit AVR ist da eher nicht sinnvoll.

Gruß
Mario

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren