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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.