Vergleich signierte (positive/negative) 16-Bit Zahlen in ASSEMBLER

#3816287
Lesenswert?

Geschätztes Forum,

wie könnte man 2 signierte 16-Bit Zahlen miteinander vergleichen?

Es soll bestimmt werden, ob die Zahl-A größer ist als die Zahl-B.


Der Wertebereich für 16Bit signiert ist:

-32768(0x8000) ...+32767(0x7FFF)


Mögliche Lösung:

Zu Zahl-A und Zahl-B wird 32768(0x8000) addiert,

somit werden beide Zahlen auf der Zahlenachse nach rechts

in den positiven Bereich geschoben,

es entstehen immer 2 positive Zahlen, welche dann

genüsslich miteinander verglichen werden können.


Bsp:

ldi R16,LOW (-32767) ; Zahl-A
ldi R17,HIGH(-32767)

ldi R18,LOW (32767) ; Zahl-B
ldi R19,HIGH(32767)

ldi R20,LOW (32768) ; Summand
ldi R21,HIGH(32768)

add R16,R20         ; Addition Zahl-A
adc R17,R21

add R18,R20         ; Addition Zahl-B
adc R19,R21

cp R17,R19          ; Vergleich HIGH-BYTE
breq...
brsh...
brlo...

cp R16,R18          ; Vergleich LOW-BYTE
breq...
brsh...
brlo...


Gibt es noch eine andere, bessere Lösung?


Danke

Bernhard
Gast #3816602
Lesenswert?

Bernhard S. schrieb:
> Gibt es noch eine andere, bessere Lösung?

Wenn es um AVR geht und es keine einmalige Hausaufgabe ist, könntest Du 
dir AVR-GCC installieren und dann ein Assembler-Listing erzeugen lassen. 
Jedenfalls hatte ich vor vielen Jahren festgestellt, dass der AVR-GCC 
oft besseren Assembler-Code erzeugt als ich selber. Und zu den Zahlen 
mit Vorzeichen -- vorzeichenbehaftet ist zwar auch nicht gerade schön, 
aber signiert trifft es nun wirklich nicht.
#3816767
Lesenswert?

Bernhard S. schrieb:
> Zu Zahl-A und Zahl-B wird 32768(0x8000) addiert,

Das ist der übliche Ansatz, wenn die Maschine keine Sprungbefehle für 
Vergleiche von Werten mit Vorzeichen hat. Dein Beispiel ist für AVRs - 
und die haben sie.

> Gibt es noch eine andere, bessere Lösung?

Vergleichen, springen. AVRs haben eigens einen CPC Befehl dafür. Hat man 
den nicht kann man auch ersatzweise ins Leere subtrahieren.

Peter Dannegger schrieb:
> Für signed Vergleich gibt es das S-Flag (BRGE, BRLT).

Zzgl. Overflow Flag V. Mit S allein gehts nicht.

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