asm subi und Konstante

OP #6588179
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?
Gast #6588206
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?
OP #6588234
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.
Gast #6588264
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.
(Firma: Vescomp) #6588268
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.
#6588271
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
...
OP #6588337
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!
(Firma: Vescomp) #6588411
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...
OP #6588643
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.
#6588728
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.
OP #6588799
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.

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