Division einer 8 Bit Konstante / eine 8 Bit Variable

Gast #600955
Lesenswert?

@ René (Gast)

>der Kehrwert von 255 ist 0.0039... das dürfe auch nicht gehen. Kommas
>sind so glaube ich auch ein Problem das nicht ohne mehr aufwand gelöst
>werden kann.

Festkommaarithmetik

Aber das löst das Problem nciht, denn die VARIABLE steht im Nenner. Da 
kommt man um einen Division nicht herum. Warum wird da so ein Theather 
draus gemacht? Wie schnell muss denn gerechnet werden? Und wozu das 
Ganze?

MfG
Falk
Gast #600966
Lesenswert?

Danke Falk für den Hinweis

ich wollte nur Register sparen da schon fast alle belegt sind. Und die 
Teilweise in Interups benutzt werden kann es zu "überschneidungen" 
kommen. Aber da werde ich nicht drum herumkommen. Die Zeit ist nicht so 
das Problem.
Es geht um RGB nach HSV und zurück umrechnung in .asm Für C gibt es ja 
schon Beispiele aber in asm ist nichts zu finden. Da mein ganzes Projekt 
aber in ASM gehalten ist habe ich ein Problem
Gast #600978
Lesenswert?

@ René (Gast)

>ich wollte nur Register sparen da schon fast alle belegt sind. Und die

Hast du keinen SRAM? Welchen Controller verwendest du?

>Teilweise in Interups benutzt werden kann es zu "überschneidungen"

Auch das Problem kann SRAM lösen. Push & Pop.

MfG
Falk
Gast #600987
Lesenswert?

damit ist eine approximation gemeint. Die Quintessenz von dem Link, der 
oben gepostet worden ist ist folgende:

man findet kurze und einfache Routinen, um Division für bestimmte Zahlen 
wie z.B. 10 zu umgehen - die funktionieren allerdings nur bis zu einem 
bestimmten Eingangswert.

Ein nahezu bestechend einfacher ist:  Eingangswert * 26 und das low-byte 
vergessen. Diese Lösung stimmt bis zu einem Eingangswert von 67. Also 
für 6 Bit genau. Das kann man nehmen, wenn man eine Anzahl Sekunden, 
Minuten, Stunden, etc. z.B. auf einem Display darstellen will [mögliche 
Eingangswerte: 0-59]. Die "Division" benötigt gerade einmal 4 Zyklen.

mov TEMP1,10
mul INPUT,TEMP1
mov OUTPUT,r1

Genauer wirds mit: (Eingangswert * 205)/8. Diese Lösung stimmt sogar bis 
1027 - also 10 Bit. Man kann soz.B. einen Messwert von 0-999 fix in die 
Einzelstellen zerlegen.

mov TEMP1,205
mul INPUT,TEMP1
shr r1
shr r1
shr r1
mov OUTPUT,r1


Für andere Divisoren als 10 müsstest du natürlich selbst solche Tricks 
aufstellen aber der Link sollte als Anregung für Methoden dazu reichen.
Gast #601612
Lesenswert?

die Approximation würde ich noch für am Besten halten. In 2er Potenzen 
multiplizieren und sehen, ob das Ergebnis größer oder kleiner dem 
Vorgabewert ist. So ähnlich. Wie man das dann programmiert, müßte 
überlegt werden.

mfg

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