Forum: Mikrocontroller und Digitale Elektronik Assembler Subtraktion 0x80-0x40: Warum hier Carry=1 und Overflow=1 ?


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Tom Z. (knopfzelle)


Bewertung
0 lesenswert
nicht lesenswert
Hi,

ich komm da nicht drauf... Das Carrybit C gibt ggf. doch den übrigen 
Übertrag an und das Overflowbit V ob das Ergebnis der Operation über 
oder unter die Grenzen des Wertebereichs geschlagen ist.

mov.b #0x80, r5
sub.b #0x40, r5

0x80-0x40=0x40
1
 1000 0000
2
-0100 0000
3
-1
4
-----------
5
 0100 0000

Das geht doch prima auf. Es bleibt weder Übertrag noch ist das Ergebnis 
kleiner als -FF oder größer als FF.

Trotzdem sind C und V im Statusregister nach der Operation beide 1. Ich 
verstehs nicht. Könnt ihr mir bitte kurz sagen was ich nicht weiß oder 
falsch verstanden habe?

Danke!

von Nikolaus S. (Firma: Golden Delicious Computers) (hns)


Bewertung
0 lesenswert
nicht lesenswert
Je nach Prozessorarchitektur ist der "Borrow" bei der Subtraktion 
negiert oder nicht. Manche Prozessoren machen auch erst eine Negation 
und addieren dann:

   0x80
+  0xc0  = "-0x40" (abgeschnitten)
=======
  0x140 => 0x40 plus "Carry" und "Overflow".

von Peter D. (peda)


Bewertung
0 lesenswert
nicht lesenswert
Ich würde mal im Instruction Set der ungenannten CPU nachschauen. Da ist 
alles ausführlich erklärt.
Und nein, es ist nicht bei allen CPUs gleich.

von Axel S. (a-za-z0-9)


Bewertung
1 lesenswert
nicht lesenswert
Noch ne Idee: ist das vielleicht signed Arithmetik?
Dann wäre das nämlich 0x80 (-128) - 0x40 (64) = -192

Und das gibt defitiv einer Überlauf.

von Yalu X. (yalu) (Moderator)


Bewertung
1 lesenswert
nicht lesenswert
Ja, das Carry-Flag wird beim MSP430 gesetzt, wenn kein Borgen
erforderlich ist.

Wie Axel geschrieben hat, wird das Overflow-Flag V wird gesetzt, wenn
bei Operationen mit vorzeichenbehafteten Zahlen ein Überlauf auftritt.
0x80 = -128 ist der kleinste in 8 Bit darstellbare Zahl. Wenn davon
etwas Positives (0x40 = +64) subtrahiert werden soll ist das Ergebnis
(-192) nicht mehr darstellbar, also wird das V-Flag gesetzt.

: Bearbeitet durch Moderator
von rbx (Gast)


Bewertung
0 lesenswert
nicht lesenswert
Nikolaus S. schrieb:
> Je nach Prozessorarchitektur ist der "Borrow" bei der Subtraktion
> negiert oder nicht. Manche Prozessoren machen auch erst eine Negation
> und addieren dann:
>
>    0x80
> +  0xc0  = "-0x40" (abgeschnitten)
> =======
>   0x140 => 0x40 plus "Carry" und "Overflow".

+1
Wenn die Seite ein Häkchen könnte, dann wäre das hier.

Erklärung u.a.
https://de.wikipedia.org/wiki/Zweierkomplement

Zitat aus der Seite:
Alternative Faustregel:

Invertiere alle Stellen
Addiere 1

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.