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

OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.