Hallo,
ich würde gerne wissen warum das Zero Flag gesetzt wird,
nachdem der Befehl "dec temp" ausgeführt wird.
Das passiert aber nur dann wenn das Register 17 "0" wird.
Danke.
O. A. schrieb:> Hallo,>> ich würde gerne wissen warum das Zero Flag gesetzt wird,>> nachdem der Befehl "dec temp" ausgeführt wird.>> Das passiert aber nur dann wenn das Register 17 "0" wird.>> Danke.>
Es muss das tun, das ist sein Job ;-)
> .DEF temp = r17> dec temp
Du hast Register 17 als 'temp' definiert, und wenn Du es runterzählst,
und es Null erreicht, zeigt das Zero Flag '1' (das Ergebniss einer
Operation ist Null).
O. A. schrieb:> ich würde gerne wissen warum das Zero Flag gesetzt wird,> nachdem der Befehl "dec temp" ausgeführt wird.> Das passiert aber nur dann wenn das Register 17 "0" wird.
Das ist ja nun eine selten dämliche Frage. Die Antwort darauf steckt in
dieser einen Zeile:
> .DEF temp = r17
Hallo,
O. A. schrieb:> ich würde gerne wissen warum das Zero Flag gesetzt wird,>> nachdem der Befehl "dec temp" ausgeführt wird.>> Das passiert aber nur dann wenn das Register 17 "0" wird.
Weil das Z-Flag (Zero) genau dafür da ist?
Weil es das Datenblatt des Mega8 so sagt.
Oder wie soll ich die Frage verstehen?
Gruß aus Merlin
Michael
c-hater schrieb:> Das ist ja nun eine selten dämliche Frage. Die Antwort darauf steckt in
Tut mir Leid dass ich ihren Ansprüchen nicht genügen konnte großer
Meister.
spess53 schrieb:> Hi>> Schmeiß für den Anfang diese .def-Gedödel raus und arbeite nur mit den> Registernamen. Da wird vieles verstänlicher.>> MfG Spess
das mit den def ist nicht das Problem, ist auch nicht mein Code wollte
eben nur wissen warum das Z-Flag gesetzt wird...aber ist mir jetzt klar.
Michael U. schrieb:> Weil das Z-Flag (Zero) genau dafür da ist?> Weil es das Datenblatt des Mega8 so sagt.> Gruß aus Merlin> Michael
D.h. jedesmal wenn ein Register Null wird, wird das Z-Flag gesetzt
korrekt?
Hi
>D.h. jedesmal wenn ein Register Null wird, wird das Z-Flag gesetzt>korrekt?
Nicht immer. Z.b. bei einem cp r16,r17 wird bei r16=r17 auch das Z-Flag
gesetzt obwohl keines der Register Null sein muss. Da muss nur r16-r17=0
sein.
MfG Spess
spess53 schrieb:> Nicht immer. Z.b. bei einem cp r16,r17 wird bei r16=r17 auch das Z-Flag> gesetzt obwohl keines der Register Null sein muss. Da muss nur r16-r17=0> sein.
Stimmt natürlich. Das wird aber klar, wenn man sich überlegt, wie der
Compare-Befehl funktioniert:
Das ist nix anderes, als eine Subtraktion, wobei allerdings das Ergebnis
nur die Flags beeinflusst, aber nicht im Register gespeichert wird.
Die Flags sind nach cp also wie nach einer Subtraktion gesetzt, im
Unterschied zur Subtraktion behalten nur beide Register ihren Inhalt.
O. A. schrieb:> Tut mir Leid dass ich ihren Ansprüchen nicht genügen konnte großer> Meister.
Das ist ja nun mal ein so einfacher Sachverhalt, dass man nicht wirklich
Meister sein muss, um ihn zu begreifen. Man muss sich einfach nur mit
den Anfangsgründen der Programmiersprache beschäftigt haben, die man zu
nutzen gedenkt, und zwar bevor man sie tatsächlich benutzt. Das ist
übrigens bei jeder Programmiersprache im Prinzip so...
Nur komplette Vollidioten ignorieren das logische Grundkonzept, ein
Werkzeug erstmal verstehen zu müssen, bevor man es sachgerecht benutzen
kann...
Und ja: Meine Ansprüche an Programmierer liegen ganz sicher über dem
Niveau eines kompletten Vollidioten. Und nein: Ich erwarte natürlich
nicht, dass ein Einsteiger in eine Programmiersprache sofort alles
darüber weiss. Er sollte aber immer alles über jedes Sprachfeature
wissen, was er benutzt. Und zwar bevor er es benutzt. Und auch: ich
erwarte zwingend, das ein Programmierer logisch denken kann. Was im
konkreten Fall bedeutet hätte, dass DU dir dir Frage hättest stellen
müssen, was zum Teufel eigentlich "temp" ist. Bei der Suche nach einer
Deklaration wärest du unvermeidlich auf diese eine Zeile gestoßen. Und
der Rest wäre mit minimaler Eigenintelligenz und -fleiß auch noch zu
lösen gewesen: Ein schlichter Blick in die Asm-Hilfe hätte geklärt, was
die ".DEF"-Direktive eigentlich tut...
>...warum das Zero Flag gesetzt wird, nachdem der Befehl "dec temp" ausgeführt
wird
Das ist der Sinn des Z-Flags überhaupt. Die interne Schaltung des
ATmegas ist absichtlich so konstruiert, dass der von Dir beobachtete
Effekt eintritt.
Es gibt aber auch Fälle, in denen Register auf Null gesetzt werden
ohne dass dabei das Z-Flag gesetzt wird:
ldi r16, 0
mov r17, r16
(push r17)
pop r18
Diese Befehle beeinflussen grundsätzlich keine Flags. Gewissermaßen in
entgegengesetzter Weise extrem ist der Befehl "tst": Er beeinflusst
nur Flags (Z, S, V und N) und lässt den Operanden unverändert. All
diese Eigenheiten kann man als Assemblerprogrammierer geschickt
ausnutzen, wenn man besonders kompakten und/oder schnellen Code
schreiben will (bzw. muss).