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


von Tom Z. (knopfzelle)


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)


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)


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)


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)


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)


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

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.