Forum: Mikrocontroller und Digitale Elektronik Vergleich signierte (positive/negative) 16-Bit Zahlen in ASSEMBLER


von Bernhard S. (bernhard)


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

: Verschoben durch Moderator
von &=0x0F (Gast)


Lesenswert?

Wie wärs damit erst mal lesen zu lernen:
"Forum: Projekte & Code

Hier könnt ihr eure Projekte, Schaltungen oder Codeschnipsel vorstellen 
und diskutieren. Bitte hier keine Fragen posten!"

von Josef G. (bome) Benutzerseite


Lesenswert?

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

Addition von 0x8000 ist einfach zu realisieren
durch Negation des Vorzeichenbits. Aber das
weisst du ja sicher selber.

von Peter D. (peda)


Lesenswert?

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

Für signed Vergleich gibt es das S-Flag (BRGE, BRLT).

von Salewski, Stefan (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Bernhard S. schrieb:
> signierte 16-Bit Zahlen

Unter „signiert“ versteht man im Deutschen üblicherweise etwas anderes.
Du meinst wohl eher „vorzeichenbehaftet“.

von (prx) A. K. (prx)


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.

: Bearbeitet durch User
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.