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?
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.
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.
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.
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.
... 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
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
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.
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.
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.
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.
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.
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.
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.
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.
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.
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".