PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Verständnisfrage zu V Flag



izaseba
13.12.2006, 23:13
Hallo, ich analysiere ein bischen den V Flag im SREG und weiß nicht so recht wovon der abhängig ist :-s
Daß er Zweierkomplementüberlauf signalisiert weiß ich schon, aber verstehen tue ich das noch lange nicht...

Nach einer gründlichen Analyse im Debugger hab ich festgestellt, daß er nur dann gesetzt wird, wenn das Ergebnis einer Operation genau 0x80 oder binär 10000000 ist :-k
Wird der nur in diesem Fall gesetzt oder hab ich irgendwas übersehen 8-[

Ich meine, ich brauch diesen Flag bis jetzt ziemlich selten bis nie, aber wissen möchte ich schon wie er funktioniert \:D/

dennisstrehl
13.12.2006, 23:25
Zum ersten ist die Funktion der Flags je nach Operation sehr unterschiedlich.

Zum zweiten: Nein, es wird nicht nur gesetzt, wenn das Ergebnis 0x80 ist.
Bei Addieren, Subtrahieren und sowas wird das gesetzt, wenn ein Überlauf über die Grenzen +127 in positiver Richtung oder -128 in negativer Richtung erfolgt.
Es erfüllt damit bei Signed-Werten in etwa die Funktion des Carry-Bits bei Unsigned-Werten.
Beim INC-Befehl ist es so wie von dir beschrieben, denn dann findet beim Sprung von 0x7F nach 0x80 eine Überlauf über +127 statt.

Ich finde jetzt auf die Schnelle keine Operation, bei der das V-Flag eine andere Funktion hat. Schau dir am besten mal das Instruction-Set (http://www.atmel.com/dyn/resources/prod_documents/doc0856.pdf) an. Da steht drin was bei welcher Operation mit welchem Flag passiert. Am besten gleich auf die Festplatte damit und in greifbarer Nähe aufbewahren, das kann man immer gebrauchen ;) Dieser (https://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User#ALU_und_Status-Register_.28SREG.29) Artikel im Wiki beschreibt das Verhalten der Status-Bits ausführlich und DAU-geeignet ;)

Mir kommt übrigens gerade eine Idee: Könnte man nicht im Wiki einen Artikel anlegen, der grundlegende Rechenoperationen aufführt? Damit meine ich neben ein paar einfachen Sachen wie 8bit-Additionen auch so Sachen wie 16bit Unsigned + 16 Bit Signed = 16bit Unsigned Saturating und sowas.
(Saturating: So dass 50000 + 20000 nicht 4464 ergibt sondern 65535 und 10000 - 20000 nicht 55536 sondern 0.)

Gruß,
Dennis

izaseba
13.12.2006, 23:53
Hallo Dennis,
Ich hab es mir schon gedacht... das wäre zu schön gewesen,
Aber danke für den Link zu Wiki, es sieht wirklich gut aus :-)

Gruß Sebastian

PicNick
14.12.2006, 07:16
..einen Artikel anlegen, der grundlegende Rechenoperationen aufführt

Muttu gucken, da haben wir schon was:
https://www.roboternetz.de/wissen/index.php/Assembler_Einf%C3%BChrung_f%C3%BCr_Bascom-User#Rechnen_mit_vorzeichenbehafteten_8_Bit

dennisstrehl
14.12.2006, 10:52
Das würde ich zu den grundlegenden Sachen zählen...
Bei dem angesprochenen "16bit Unsigned + 16 Bit Signed => 16bit Unsigned Saturating" muss man schon mit zwei Status-Bits jonglieren. (Es sei denn ich hab beim Proggen mal wieder zu kompliziert gedacht...)

Edit: Hab mich vertan. Es muss heißen "16bit Unsigned - 16 Bit Unsigned => 16bit Signed Saturating"

(Edit2: Gibt natürlich keien Garantie auf Funktionsfähigkeit, hab's noch nicht ausführlich getestet)


sub low1, low2
sbc high1, high2

brcs carrySet
brpl end
ldi low1, 0xFF
ldi high1, 0x7F
rjmp end
carrySet:
brmi end
ldi low1, 0x00
ldi high1, 0x80
end

Erklärung: Am Anfang wird erstmal einfach eine 16bit-Subtraktion ausgeführt. Der zweite Teil prüft erstmal über das Carry-Bit, ob ein positiver oder ein negativer Wert rauskommen müsste (Carry gesetzt => Wert 2 größer als Wert 1 => negativer Wert müsste rauskommen, andersrum das gleiche). Je nachdem ob das Carry-Bit gesetzt ist oder nicht, wird entweder im oberen Teil weitergemacht oder es wird zum unteren Teil gesprungen. Da wird jeweils getestet, welches Vorzeichen das Ergebnis hat. Wenn das Carry nicht gesetzt ist und das Negative-Flag gesetzt ist, dann fand ein Überlauf in positiver Richtung statt und das Ergebnis wird auf 0x7FFF gesetzt. Wenn das Carry gesetzt ist, aber das Negative-Flag nicht gesetzt ist, fand ein Überlauf in negativer Richtung statt, und das Ergebnis wird auf 0x8000 gesetzt.

Sowas meinte ich halt. ;)

izaseba
14.12.2006, 16:33
Ich hab mich bis jetzt um das vorzeichenbehaftete Rechnen gekonnt gedrückt :-b

Es ist aber immer gut die zusammenhänge zu verstehen...

Gruß Sebastian