Forum: Mikrocontroller und Digitale Elektronik 2 32 Bit Zahlen Vergleichen in ASM


von martin (Gast)


Lesenswert?

Hallo,

Ich habe zwei 32 Bit zahlen in Register 21-24 und Register 4-7 meines
AT-Megas.
Nun will ich einen bedingten Sprung machen wenn die Zahl in OP1
(R21-R24) groesser ist als OP2 (R4-7).
Normal kein problem, man muss halt nacheinander die einzelnen Bytes
vergleichen.
Nun ist meine zahl aber moeglicherweise Negativ DH mit signed Bit und 2
Komplement.
Wie mache ich das jetzt?

Weiss jemand vielleicht eine fertige routine?

von Der Albi (Gast)


Lesenswert?

Subtrahier doch einfach die 2 Zahlen voneinander... (Zahl1-Zahl2)
Dann ist entweder
1.) Das SignedBit gesetzt, wenn Zahl1 < Zahl2
2.) die Unteren 31 Bit nicht Null, wenn Zahl1 > Zahl2
3.) Alles Null, wenn Zahl1 == Zahl2

Ist das schon zu umständlich?

MFG

von martin (Gast)


Lesenswert?

Kann ich dass den Byteweise subtrahieren?
Obwohl es eventuell negativ ist?

Geht die SUbtraktion dann genauso wie bei einer positiven Zahl?

von Dietmar (Gast)


Lesenswert?

Sind das echte Signed-Werte, die in den Registern stehen?
D.h., bei negativen Werten, Sign-Bit gesetzt und 2-er Komplement?

Es gibt hier 4 Möglichkeiten:

Erstens, eine Fallunterscheidung nach dem Sign-Bit durchführen:

Fall1: Zahl1 positiv, Zahl2 positiv
Fall2: Zahl1 positiv, Zahl2 negativ
Fall3: Zahl1 negativ, Zahl2 positiv
Fall4: Zahl1 negativ, Zahl2 negativ

Auswertung:

Fall1: Beide Zahlen haben Sign Flag 0:
Zahl2 von Zahl1 unsigniert subtrahieren. Wenn Carry gesetzt: Zahl2
größer als Zahl1.

Fall2 und Fall3: Beide Zahlen haben unterschiedliche Sign Flags:
Die Zahl mit dem kleineren Sign Flag Wert ist größer.

Fall4: Beide Zahlen haben Sign Flag 1:
Zahl2 von Zahl1 unsigniert subtrahieren. Wenn Carry gesetzt: Zahl1
größer als Zahl2.

Gruß

Dietmar

von Rolf Magnus (Gast)


Lesenswert?

Eine Fallunterscheidung sollte eigentlich nicht n&#56319;&#57078;tig
sein. Einfach nur die normalen Vergleiche (cp, cpc) machen. Man
mu&#56319;&#57055; nur den richtigen Branch-Befehl f&#56319;&#57084;r
vorzeihcenbehaftete Zahlen nehmen.

> Subtrahier doch einfach die 2 Zahlen voneinander... (Zahl1-Zahl2)

Ein Vergleich reicht. Der tut flagm&#56319;&#57060;&#56319;&#57055;ig
dasselbe, aber man mu&#56319;&#57055; nicht das sowieso nicht
ben&#56319;&#57078;tigte Ergebnis zwischenspeichern.

von martin (Gast)


Lesenswert?

ja habs jetzt richtig. 5 assembler befehle reichen.

von Christoph W. (christoph)


Lesenswert?

Für eine eventuell negative Zahl mit einer positiven Zahl (so wie ich
das verstanden hab) :

sbrc   r21,7
rcall  INVERT
cp     r21,r4
cpc    r22,r5
cpc    r23,r6
cpc    r24,r7
br??

INVERT:
neg   r21
neg   r22
neg   r23
neg   r24
ret

fertig. 32 Bit vergleich. Beachte, dass das High-Byte zuerst verglichen
werden muss. Das soltle in etwa das Prinzip sein. Da ich das nicht
überprüft habe, soltlest du es nochmals tun, bevor du den Schnipsel
verwendest.

von A.K. (Gast)


Lesenswert?

Falsch verstanden.

32bit-Vergleich funktioniert exakt genauso wie 8bit-Vergleich, nur halt
mit 4 Befehlen:
  cp     r21,r4
  cpc    r22,r5
  cpc    r23,r6
  cpc    r24,r7
statt
  cp     r21,r4
Und dann
  brlt   wenn_r21ff_kleiner_r4ff

Soll der Vergleich andersrum sein, dann die Register entsprechend
vertauschen.

Die Invertierung funktioniert so garantiert nicht. Negate-with-Carry
gibt's nicht, also muss da subtrahiert werden.

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.