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
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!"
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.
Bernhard S. schrieb: > Gibt es noch eine andere, bessere Lösung? Für signed Vergleich gibt es das S-Flag (BRGE, BRLT).
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.
Bernhard S. schrieb: > signierte 16-Bit Zahlen Unter „signiert“ versteht man im Deutschen üblicherweise etwas anderes. Du meinst wohl eher „vorzeichenbehaftet“.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.