Forum: Mikrocontroller und Digitale Elektronik AVR SREG Flags


von ich (Gast)


Lesenswert?

Hallo zusammen,

ich habe eine kurze AVR Detailfrage. Beim Abhandeln vom Code im AVR ist 
mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar. 
Geht man hier von oben nach unten (I->C) oder anders herum (C->I).

z.B. bei AND

Bit: Operation
4: SFlag = NFlag xor VFlag
3: VFlag = 0

Wird zuerst das SFlag berechnet oder das VFLag auf 0 gesetzt. Weiß 
jemand wo die richtige Reihenfolge beschrieben ist?

von CK (Gast)


Lesenswert?

Die Flags werden im gleichen Taktschritt gesetzt


ansonsten hilft dir vielleicht das hier:
http://ww1.microchip.com/downloads/en/devicedoc/atmel-0856-avr-instruction-set-manual.pdf

von Stefan E. (sternst)


Lesenswert?

ich schrieb:
> mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar.

Es gibt keine Reihenfolge. Die werden gleichzeitig gesetzt.

von Carl D. (jcw2)


Lesenswert?

Stefan E. schrieb:
> ich schrieb:
>> mir die Reihenfolge der Manipulation der SREG-Flags nicht ganz klar.
>
> Es gibt keine Reihenfolge. Die werden gleichzeitig gesetzt.

Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND 
das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften.

von Rolf M. (rmagnus)


Lesenswert?

Carl D. schrieb:
> Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND
> das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften.

Ich finde das nicht "schreib-/denkfaul", sondern konsistent. Es kann 
genauso zu Verwirrung führen, wenn für die Instruktion die Beschreibung 
des Verhaltens anders ist als für andere.

von Carl D. (jcw2)


Lesenswert?

Rolf M. schrieb:
> Carl D. schrieb:
>> Was dank schreib-/denkfaul gemachter Doku dazu führt, daß bei z.B. AND
>> das "xor VFlag" eigentlich nichts macht, außer Verwirrung zu stiften.
>
> Ich finde das nicht "schreib-/denkfaul", sondern konsistent. Es kann
> genauso zu Verwirrung führen, wenn für die Instruktion die Beschreibung
> des Verhaltens anders ist als für andere.

Was ist daran konsistent, wenn das Verhalten nur durch die nicht 
Beschriebene Annahme "V wird auf 0 gesetzt und danach in der Verknüpfung 
N^V verwendet" erklärbar ist. Oder man schreibt eben "V = 0; S = N".
S ist auch nicht nur der Ausgang eines Xor-Gatters, denn man kann N, S 
und V unabhängig voneinander setzen/löschen. S ist also ein echtes 
Register und dann stellt sich schon die Frage, ob Vn oder Vn-1 benutzt 
wird. Öder eben "0" für beide Verknüpfungen, was der Hardware-Wahrheit 
sicher am näherten kommt.

von ich (Gast)


Lesenswert?

Ok, das heißt die Berechnungsvorschrift lautet:

Bit: Operation
4: SFlag(n) = NFlag(n-1) xor VFlag(n-1)
3: VFlag(n) = 0

von Rolf M. (rmagnus)


Lesenswert?

Carl D. schrieb:
> Was ist daran konsistent, wenn das Verhalten nur durch die nicht
> Beschriebene Annahme "V wird auf 0 gesetzt und danach in der Verknüpfung
> N^V verwendet" erklärbar ist.

Es wurde doch schon gesagt: Es wird nicht nach irgendwas anderem 
gemacht, sondern gleichzeitig. Vor der Instruktion stehen die Register 
irgendwie, nach der Instruktion stehen sie genau so, wie diese 
Gleichungen besagen.

> Oder man schreibt eben "V = 0; S = N".

Dein Fehler ist, dass du da einen zeitlichen Ablauf hinein 
interpretierst, der gar nicht existiert. Das sind keine Codezeilen, die 
eine nach der anderen ausgeführt werden. Es ist einfach nur eine 
Beschreibung des Zustands der Flags nach Ausführung der Instruktion.

> S ist auch nicht nur der Ausgang eines Xor-Gatters, denn man kann N, S
> und V unabhängig voneinander setzen/löschen.

Nach Ausführung der Instruktion entspricht der Wert in S dem Ergebnis 
von N xor V. Nicht mehr und nicht weniger sagt diese Zeile aus. Sie 
bedeutet weder, dass die Flags eins nach dem anderen gesetzt werden, 
noch, dass da irgendwo ein physisches XOR-Gatter den Wert erzeugt.

> S ist also ein echtes Register und dann stellt sich schon die Frage, ob
> Vn oder Vn-1 benutzt wird.

Nur wenn man es nicht richtig verstanden hat.

von (prx) A. K. (prx)


Lesenswert?

... schrieb:
> 4: SFlag(n) = NFlag(n-1) xor VFlag(n-1)

Nein. Es hilft allerdings, eine wenigstens kleine Vorstellung der 
Arbeitsweise von Prozessoren zu haben. Dahingehend, dass aus der ALU ein 
paar Zustände rauskommen, die anschliessend als Flags gespeichert 
werden. Und so kommen aus der ALU eben u.A. ein Vorzeichenstatus und ein 
Überlaufstatus raus. Nur ist der Überlaufstatus bei einer AND Operation 
eben 0.

Eine Einbeziehung des vorigen Zustandes gibt es beim AVR allerdings 
auch, das gibts sonst nicht so oft. Und zwar in der Handhabung des Z 
Flags bei den Operationen CPC und SBC

von ich (Gast)


Lesenswert?

Sry, aber eine uC ist eine Maschine und damit deterministisch. Deine 
Beschreibung ist:

Eingang -> etwas magisches passiert -> Ausgang.

Es muss eine ganz klare mathematische Beschreibung geben, was da 
passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine 
glasklare Reihenfolge und die lautet:
1. bestimme N
2. ermittle daraus S

von S. R. (svenska)


Lesenswert?

ich schrieb:
> Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine
> glasklare Reihenfolge und die lautet:

Ich kann auch S und N mit einem Draht verbinden, dann sind die auch 
gleich, aber deine Schrittfolge findet nicht statt.

von Rolf M. (rmagnus)


Lesenswert?

ich schrieb:
> Sry, aber eine uC ist eine Maschine und damit deterministisch.

Natürlich.

> Deine Beschreibung ist:
>
> Eingang -> etwas magisches passiert -> Ausgang.

Ob der Prozessor nun mit magischem Rauch oder mit irgendwelchen Gattern 
und Badelatschen funktioniert, spielt eigentlich keine Rolle. Die 
Beschreibungen der Instruktionen sollen nicht die interne Funktion des 
Prozessors erklären, sondern das Ergebnis der Instruktion. Wie es 
zustande kommt, ist doch dafür vollkommen irrelevant.

> Es muss eine ganz klare mathematische Beschreibung geben, was da
> passiert.

Die beschreibt aber einen Zusammenhang und keinen Ablauf.

> Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine
> glasklare Reihenfolge und die lautet:
> 1. bestimme N
> 2. ermittle daraus S

S = N ist mathematisch zu 100% äquivalent zu N = S. Beides sagt einfach 
aus, dass die beiden Werte gleich sind, ohne dass es dazu irgendeine 
Reihenfolge gäbe. Deshalb schrieb ich ja: Es sind keine Codezeilen, 
sondern ein mathematischer Zusammenhang. Bei Programmcode wäre es 
tatsächlich so wie du schreibst: Der Wert von N wird gelesen und dann 
nach S kopiert.

von (prx) A. K. (prx)


Angehängte Dateien:

Lesenswert?

Wobei man fairerweise reinsehen sollte, was Atmel tatsächlich verbrochen 
hat. Ein "=" findet sich da nicht. V,N,Z ist klar beschrieben, aber 
nicht S. Wenn man nicht weiss, wozu S gut ist, weshalb das so definiert 
ist, kann man bei dieser Vorwärtsreferenz schon auf seltsame Gedanken 
kommen.

Weiter vorne im PDF, in der Beschreibung von SREG, stehts auch nicht 
deutlicher drin. Da dieses S Flag branchenuntypisch ist, hilft auch kein 
Blick in die Runde. Meist verwenden Sprungbedingungen die 4 Flags 
N,Z,V,C mit Kombinatorik in der Auswertung der Bedingung, aber nicht bei 
Atmel.

von c-hater (Gast)


Lesenswert?

ich schrieb:
> Sry, aber eine uC ist eine Maschine und damit deterministisch.

Jepp. Aber sie ist nicht zeitlos, sondern arbeitet synchron in Takten. 
Kombinatorische Logik zwischen zwei Takten kann aber beliebig komplex 
sein (solange die Summe von deren Gatterlaufzeiten kleiner als eine 
Periode der Taktfrequenz ist).
Aus Sicht der Maschine können deshalb Ergebnisse durchaus "gleichzeitig" 
erscheinen, die logisch voneinander abhängig sind.

> Es muss eine ganz klare mathematische Beschreibung geben, was da
> passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine
> glasklare Reihenfolge und die lautet:
> 1. bestimme N
> 2. ermittle daraus S

Jepp, die zuständigen Gatter in der ALU werden das wohl auch so 
umsetzen. Die Maschine bekommt aber von dieser Reihenfolge nix mit. Für 
die stehen im nächsten Takt einfach die korrekten Ergebnisse in beiden 
Flags.

von c-hater (Gast)


Lesenswert?

A. K. schrieb:

> V,N,Z ist klar beschrieben, aber
> nicht S.

Das stimmt leider. Hier ist die Dokumentation, vorsichtig ausgedrückt, 
unzureichend. Man könnte auch einfach sagen: beschissen.

Allerdings hat dieser Sachverhalt eigentlich nichts mit dem gedanklichen 
Problem des TO zu tun.

Denn das besteht ganz klar darin, dass diesem nicht klar ist, das beim 
AVR8 (und auch praktisch jeder anderen Architektur) sehr viel 
kombinatorische Logik asynchron zum MCU-Takt arbeitet, aus Sicht des 
Programms also scheinbar das Gesetz der Kausalität verletzen kann.

von Carl D. (jcw2)


Lesenswert?

ich schrieb:
> Sry, aber eine uC ist eine Maschine und damit deterministisch. Deine
> Beschreibung ist:
>
> Eingang -> etwas magisches passiert -> Ausgang.
>
> Es muss eine ganz klare mathematische Beschreibung geben, was da
> passiert. Und wenn gilt S = N, dann gibt es hier aus meiner Sicht eine
> glasklare Reihenfolge und die lautet:
> 1. bestimme N
> 2. ermittle daraus S

Die Sache ist eigentlich simpel. Es gibt vor dem SREG ein Schaltwerk, 
das den gleichen Wert (hier 0) für das Speichern des V-Bits liefert, den 
es auch für das Xor mit N benutzt, dessen Ergebnis im S-Bit gespeichert 
wird.
Es wird durch die Schreibeweise in der Doku der Eindruck erweckt, daß es 
eine zeitliche Abfolge gäbe und damit erst N^V berechnet wird und dann V 
auf "0" gesetzt wird. Das ist wohl nicht so. Es wäre auch nicht wirklich 
sinnvoll.
Genauso wenig wie es sinnvoll ist ein DB als Rätselbuch zu gestallten. 
Gerade wenn man nämlich schon mal gehört hat was ein getaktetes 
Schaltwerk ist, rechnet man damit, das die Eingangswerte nicht die 
zukünftigen Ausgangwerte sein können. Und Zunkunft ist dabei alles, was 
noch mehr als 0ps braucht, um berechnet zu sein. "=0" dauert auch mehr 
als 0ps.

von Theor (Gast)


Lesenswert?

Aus meiner Sicht ist nichts falsch, irreführend oder rätselhaft an der 
Darstellung in der Beschreibung der Status-Flags.

Die Fragestellung ergibt sich aus der falschen Interpretation der 
Beschreibung. Sie ist nicht imperativ (das ist hier indirekt schon 
gesagt worden, indem man bestritt, dass die Ausdrücke in einer 
bestimmten Reihenfolge interpretieren muss) sondern "deklarativ" oder 
"prädikativ".

Zum den Eigenschaften dieser Sprachtypen in Bezug auf die Programmierung 
siehe: https://de.wikipedia.org/wiki/Programmierparadigma

Analoge Eigenschaften gibt es in Bezug auf z.B. auf mathematische oder 
boolesche Gleichungen. Sie sind "deklarativ" gemeint und auch so zu 
interpretieren.

Der Vorwurf, es handele sich in diesem Fall um Irreführung, 
Schlampigkeit oder irgendeine Form der unreflektierten Ausdrucksweise 
etc. ist unberechtigt.

Es ist verständlich, dass ein Anfänger der Programmierung, der mit einer 
imperativen Sprache beginnt, zunächst anderen Texte, die syntaktisch 
damit identisch oder verwandt erscheinen, spontan auch als "imperativ" 
gemeint interpretieren. Aber das ist allgemein nicht korrekt und trifft 
hier im Einzelfall nicht zu.

von Theor (Gast)


Lesenswert?

Theor schrieb:
> [...] Sie ist nicht imperativ (das ist hier indirekt schon
> gesagt worden, indem man bestritt, dass die Ausdrücke in einer
> bestimmten Reihenfolge interpretieren muss) sondern "deklarativ" oder
> "prädikativ".

Sorry, Rolf. Du hast das zusätzlich direkter gesagt.

von (prx) A. K. (prx)


Lesenswert?

Theor schrieb:
> Aus meiner Sicht ist nichts falsch, irreführend oder rätselhaft an der
> Darstellung in der Beschreibung der Status-Flags.

Dokumentation hat mitunter auch den Zweck, jenen, die etwas noch nicht 
verstanden haben, das vermisste Verständnis zu vermitteln. Wenn man die 
Doku jedoch erst versteht, nachdem man bereits verstanden hat, was damit 
ausgesagt werden soll... ;-)

Eine instruction set reference ist allerdings keine Anleitung und setzt 
Vorwissen voraus.

Beitrag #5564448 wurde von einem Moderator gelöscht.
von Rolf M. (rmagnus)


Lesenswert?

Theor schrieb:
> Analoge Eigenschaften gibt es in Bezug auf z.B. auf mathematische oder
> boolesche Gleichungen. Sie sind "deklarativ" gemeint und auch so zu
> interpretieren.

Steht ja auch direkt drüber: "Boolean Formula".

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.