Hallo ich suche Möglichkeiten, in AVR-Assembler durch 200 zu teilen, und zwar möglichst effezient. Also fast ohne Speicherplatzverbrauch. Gruss Robert
Gast
#2420133
Hi >ich suche Möglichkeiten, in AVR-Assembler durch 200 zu teilen, und zwar >möglichst effezient. Also fast ohne Speicherplatzverbrauch. Kommt darauf an , was du durch 200 teilen willst. 8,16 32,64... Bit? MfG Spess
16 und 32 bit.
Gast
#2420156
Hi Ein paar Links: http://www.avr-asm-tutorial.net/avr_de/rechnen/div8d.html http://www.atmel.com/dyn/resources/prod_documents/doc0936.pdf http://www.atmel.com/dyn/resources/prod_documents/AVR200.zip Beitrag "DIVISION 32 BIT / 32BIT Beispiel (Assembler) ATmega8" MfG Spess
Gast
#2420165
Von Atmel gibts feine Appnotes :) Da ist auch ne 32bit/32bit Division aufgeführt. Einmal auf Code Größe und einmal auf Leufzeit optimiert. Die kannst du ja direkt nehmen oder weiter optimieren. Bei dir würde ja auch 32bit/8bit reichen :)
Gast
#2420169
Servus, kann man nicht einfach 3x Shiften? also um 7, um 6 und um 3? Oder führt das nicht zum Ziel? gruß~
Gast
#2420171
heldvomfeld schrieb: > Servus, kann man nicht einfach 3x Shiften? also um 7, um 6 und um 3? > Oder führt das nicht zum Ziel? > > gruß~ nein.
Hallo, im Beispiel unten, die 10 in 200 ändern. Lässt sich auch leicht auf 24 oder 32 Bit erweitern.
1 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
Gast
#2420194
Das kann man sicher optimieren. 200=2*2*2*5*5 Die 2*2*2 lassen sich durch eine Verschiebung nach rechts realisieren. Für die 25 lässt sich bestimmt auch was finden.
Gast
#2420198
/25? 25=0x11001; Das Ergebnis sollt sich in 5 Schritten berechnen lassen.
Gast
#2420203
also so: Beitrag "Binär Division"
Hallo, falls doch zusätzlich zur Ausgangzahl (R1) noch Platz für ein Zahl gleicher Größe (R2) vorhanden ist, kann man diese Variante div100 ja anwenden. http://www.tiac.net/~cri/2002/divide100.html Ohne Vergleiche nur simples schieben und addieren.
Gast
#2420346
Wer Code-sparend rechnen will, sollte bedenken: - Addieren / Subtrahieren ist "billig". - Multiplizieren "teuer" - Dividieren (außer durch Vielfache von 2) "Luxus" Also, wenn du vorher vielleicht schon multiplizieren musstest: Multipliziere doch so, dass du durch 256 teilen musst!
Hallo, sehr code-sparend ist doch schon die Variante von juergen_w Beitrag "Re: Teilen durch 200 in ASM" und braucht nur 2 Byte extra für Schleifenzähler und Rest. Die Laufzeit war R. Freitag ja nicht wichtig und ~210 Takte ist ja so schlimm nicht für 16 bit / 8 Bit. Man muss halt seine Ausgangszahl in Temp2/Temp3 eventuell vorher in Sicherheit bringen.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.