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?
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
Kann ich dass den Byteweise subtrahieren? Obwohl es eventuell negativ ist? Geht die SUbtraktion dann genauso wie bei einer positiven Zahl?
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
Eine Fallunterscheidung sollte eigentlich nicht n��tig
sein. Einfach nur die normalen Vergleiche (cp, cpc) machen. Man
mu�� nur den richtigen Branch-Befehl f��r
vorzeihcenbehaftete Zahlen nehmen.
> Subtrahier doch einfach die 2 Zahlen voneinander... (Zahl1-Zahl2)
Ein Vergleich reicht. Der tut flagm����ig
dasselbe, aber man mu�� nicht das sowieso nicht
ben��tigte Ergebnis zwischenspeichern.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.