Forum: Mikrocontroller und Digitale Elektronik asm subi und Konstante


von Bruno M. (brumay)


Lesenswert?

Hallo,

ich weiß mal wieder nicht so richtig weiter!

Ich habe eine variable 16-Bit Zahl von der ich die Konstante 10 abziehen 
will.
Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850. Ist die Zahl 
größer 10 ist das kein Problem. Was mache ich aber bei einer Zahl 
kleiner 10?
Vom Ablauf her muß ich ja erst feststellen, ob die Zahl kleiner 10 ist 
und ob sie links oder rechts von der 0 steht. Steht sie links kann ich 
die 10 einfach addieren. Steht sie aber rechts, muß ich die Zahl von 10 
abziehen und den Rest links der 0 wieder dazu zählen. Das klingt sehr 
kompliziert.

Fällt jemand eine elegante Lösung ein?

von Achim H. (pluto25)


Lesenswert?

Ich würde einfach 10 abziehen und nachher feststellen ob sie zu klein 
war (Carry set). Wenn nicht alles ok, wenn doch wieder 10 dazu zählen um 
den Rest zu kennen oder was auch immer getan werden soll.

von S. Landolt (Gast)


Lesenswert?

> Das klingt sehr kompliziert.
In der Tat! Und das mit 'links und rechts' habe ich gleich gar nicht 
verstanden.

> Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850
Nach diesem Satz hätte ich gedacht, dass ohnehin nur 10er-Werte 
auftreten. Wenn nicht, wie wäre es mit generell -10, und dann auf das 
Carry abfragen?

von Bruno M. (brumay)


Lesenswert?

S. Landolt schrieb:

> Und das mit 'links und rechts' habe ich gleich gar nicht
> verstanden.

Das kann ich verstehen, aber mir fiel nichts besseres ein.
Mit links meine ich 300 bis 0 und rechts 0 bis 850.

> Wenn nicht, wie wäre es mit generell -10, und dann auf das
> Carry abfragen?

Das paßt ja nur rechts. Links müßte ich dann ja 20 addieren.

Wenn ich rechts bin, ist das mit dem Carry als ersten Schritt sicherlich 
richtig, aber dann muß ich ja noch feststellen wie groß der Unterlauf 
ist, damit ich ihn links wieder dazu zählen kann.

von S. Landolt (Gast)


Lesenswert?

Ich habe es noch immer nicht verstanden. Eine Beispielfolge mit 
konkreten Werten würde mir helfen.

von S. Landolt (Gast)


Lesenswert?

Über eine halbe Stunde, um ein paar Zahlen niederzuschreiben?
 (Herr von Stumm):

Stumm erfindet eine Art von Schaltern,
die erst viele Stunden später schalten.
Jeder drückt und dreht und schiebt verzweifelt,

schimpft und flucht und schwört: "verflixter Schalter".
Bis dann endlich schließen sich Kontakte,
laufen Ströme durch die lange Leitung.

KLEN, in memoriam

Alternativ, und passend zur Fastnacht (Herr von Korf):

Korf erfindet eine Art von Witzen,
die erst viele Stunden später wirken.
Jeder hört sie an mit Langerweile.

Doch als hätt ein Zunder still geglommen,
wird man nachts im Bette plötzlich munter,
selig lächelnd wie ein satter Säugling.

C. Morgenstern

Also dann: Hoorig isch die Katz!
(meinetwegen auch der Bär wie bei den Gengenbachern) -  ich  bin  weg.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bruno M. schrieb:
> Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850. Ist die Zahl
> größer 10 ist das kein Problem. Was mache ich aber bei einer Zahl
> kleiner 10?

 So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder
 0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10,
 sondern nur auf Null.

> Vom Ablauf her muß ich ja erst feststellen, ob die Zahl kleiner 10 ist
> und ob sie links oder rechts von der 0 steht.

 Das ist schon mal falsch erklärt - wenn die Zahl rechts steht, wird
 diese hochgezählt, also keine Prüfung auf kleiner 10, sondern auf
 größer 840.

 Einen Richtungsflag vorsehen und die Sache läuft.

von Thomas (kosmos)


Lesenswert?

Eine Zahl zwischen 0 und 850, da braucht man nur 10 Bits.

Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10 
abziehen wenn nicht weitermachen

cpi LowByte, 10 ; Vergleiche LowByte mit 10
brge Minus10    ; Wenn LowByte größer oder gleich 10 springe zur 
Subtraktionsroutine
...

von Bruno M. (brumay)


Lesenswert?

Marc V. schrieb:
> So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder
>  0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10,
>  sondern nur auf Null.

Ich weiß nicht woraus du geschlossen hast, daß die Zahlenreihe aus 10er 
Schritten besteht?

Thomas O. schrieb:
> Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10
> abziehen wenn nicht weitermachen
>
> cpi LowByte, 10 ; Vergleiche LowByte mit 10
> brge Minus10    ; Wenn LowByte größer oder gleich 10 springe zur
> Subtraktionsroutine

Erst mal danke, das werde ich mir genauer ansehen!

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Bruno M. schrieb:
> Marc V. schrieb:
>> So, wie du das geschrieben hast, kann die Zahl entweder genau 10 oder
>>  0 sein. Nix mit Werten dazwischen, also auch keine Prüfung auf < 10,
>>  sondern nur auf Null.
>
> Ich weiß nicht woraus du geschlossen hast, daß die Zahlenreihe aus 10er
> Schritten besteht?

 Daraus:
Bruno M. schrieb:
> Ich habe eine variable 16-Bit Zahl von der ich die Konstante 10 abziehen
> will.
> Die Zahl geht von 300 runter auf 0 und wieder hoch auf 850.

 Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann
 entschuldige ich mich.

 Ach ja, Wochenende...

von Bruno M. (brumay)


Lesenswert?

Marc V. schrieb:
> Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann
>  entschuldige ich mich.

Tut mir leid, aber diese Logik verstehe ich nicht. Ich kann doch von 
einer fortlaufenden Zahlenreihe eine beliebige Zahl nehmen und davon 10 
abziehen.

Thomas O. schrieb:
> Eine Zahl zwischen 0 und 850, da braucht man nur 10 Bits.
>
> Man vergleicht einfach ob das low Byte >= 10 ist, wenn ja, dann 10
> abziehen wenn nicht weitermachen

Das stimmt m.E. nicht.
850 sind hex 0x352, d.h. auch bei 0x100 bis 0x109 ist das low Byte < 10. 
Das gleiche gilt für 0x200 und 0x300.

Mir ist noch eingefallen, wie ich die Zahlenreihe erklären kann, u.z. 
geht sie fortlaufend von -300 bis +850, aber ohne Vorzeichen.

von Rolf M. (rmagnus)


Lesenswert?

Bruno M. schrieb:
> Marc V. schrieb:
>> Wenn für dich eine Konstante 10 keinen 10er Schritt darstellt, dann
>>  entschuldige ich mich.
>
> Tut mir leid, aber diese Logik verstehe ich nicht. Ich kann doch von
> einer fortlaufenden Zahlenreihe eine beliebige Zahl nehmen und davon 10
> abziehen.

Du hast aber geschrieben, dass du bei 300 anfängst, also einem 
ganzzahligen Vielfachen von 10. Wenn du dann immer nur genau 10 
abziehst, kann das Ergebnis auch nur ein ganzzahliges Vielfaches von 10 
sein.

> Mir ist noch eingefallen, wie ich die Zahlenreihe erklären kann, u.z.
> geht sie fortlaufend von -300 bis +850, aber ohne Vorzeichen.

Genau daran dachte ich auch. Deshalb wäre mein Vorschlag, das eben 
einfach mit Vorzeichen zu machen. Damit löst sich das Problem in Luft 
auf. Bei der Verwendung des Wertes kannst du ja den Betrag bilden.

von Bruno M. (brumay)


Lesenswert?

Rolf M. schrieb:
> Du hast aber geschrieben, dass du bei 300 anfängst, also einem
> ganzzahligen Vielfachen von 10. Wenn du dann immer nur genau 10
> abziehst, kann das Ergebnis auch nur ein ganzzahliges Vielfaches von 10
> sein.

OK! Klassisches Mißverständnis

> Genau daran dachte ich auch. Deshalb wäre mein Vorschlag, das eben
> einfach mit Vorzeichen zu machen. Damit löst sich das Problem in Luft
> auf. Bei der Verwendung des Wertes kannst du ja den Betrag bilden.

Danke für den Vorschlag, aber inzwischen habe ich das Programm so 
umgeschrieben, daß ich dieses Problem vermeide.

von Thomas (kosmos)


Lesenswert?

OK dann muss man eben noch das HighByte auf >0 prüfen und das Carry für 
den Übertrag ranziehen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.