AVR SREG Flags

Gast #5564047
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?
#5564069
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.
#5564083
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.
#5564161
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.
#5564172
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
Gast #5564174
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
#5564191
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.
#5564207
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.
Angehängte Dateien:
Gast #5564324
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.
Gast #5564338
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.
#5564346
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.
Gast #5564404
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.
Gast #5564416
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.
#5564418
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren