mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik warum geht das Z-Flag auf 1


Autor: O. A. (sokrates1989)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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.
;+------------------------------------------------------------------------------
;| Titel : Aufgabe 1b
;| Prozessor : ATmega8
;| Frequenz : 3,6864 MHz
;| Datum :
;| Autor : 
;| Guppe :
;|
;| ...
;+------------------------------------------------------------------------------

.include "m8def.inc" 
.DEF temp = r17
.DEF akku = r18

;-------------------------------------------------------------------------------
; Reset and Interruptvectoren ; VNr. Beschreibung
begin:
 
rjmp main ; 1 POWER ON RESET
reti ; 2 Int0-Interrupt
reti ; 3 Int1-Interrupt
reti ; 4 TC2 Compare Match
reti ; 5 TC2 Overflow
reti ; 6 TC1 Capture
reti ; 7 TC1 Compare Match A
reti ; 8 TC1 Compare Match B
reti ; 9 TC1 Overflow
reti ; 10 TC0 Overflow
reti ; 11 SPI, STC Serial Transfer Complete
reti ; 12 UART Rx Complete
reti ; 13 UART Data Register Empty
reti ; 14 UART Tx Complete
reti ; 15 ADC Conversion Complete
reti ; 16 EEPROM Ready
reti ; 17 Analog Comparator
reti ; 18 TWI (I²C) Serial Interface
reti ; 19 Store Program Memory Ready
;--------------------------------------------------------------------------

; Start

main: 

ldi r16 , LOW(RAMEND)   ; Init Stackpointer Low
out SPL , r16       ; init Stack
ldi r16 , HIGH(RAMEND)   ; init Stackpointer High
out SPH , r16       ; init Stack

ldi r19, 0x00
out DDRB, r19      
ldi akku, 10


mainloop:

marke: 

mov temp, akku
out PORTB, temp
dec temp
mov akku, temp
brne marke

ldi temp, 10
mov akku, temp

rjmp mainloop  

Autor: Heinz V. (heinz_v)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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).

Autor: c-hater (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Michael U. (amiga)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: O. A. (sokrates1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Heinz V. schrieb:
>  zeigt das Zero Flag '1' (das Ergebniss einer
> Operation ist Null).

das war mir nicht ganz klar.
Danke.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

Schmeiß für den Anfang diese .def-Gedödel raus und arbeite nur mit den 
Registernamen. Da wird vieles verstänlicher.

MfG Spess

Autor: O. A. (sokrates1989)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: O. A. (sokrates1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: O. A. (sokrates1989)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
1 lesenswert
nicht lesenswert
O. A. schrieb:
> D.h. jedesmal wenn ein Register Null wird, wird das Z-Flag gesetzt
> korrekt?

Dafür ist es da. "Z" steht für "Zero", also Null.

Autor: spess53 (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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

Autor: Michael U. (amiga)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hallo,

O. A. schrieb:
> D.h. jedesmal wenn ein Register Null wird, wird das Z-Flag gesetzt
> korrekt?

nicht zwingend, mov z.B. ändert beim Mega8 die Flags garnicht.
Assemblerbeschreibung der CPU entsprechend befragen.

https://www.mikrocontroller.net/articles/AVR_ASM_B...

Gruß aus Berlin
Michael

Autor: Thosch (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
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.

Autor: c-hater (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
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...

Autor: LostInMusic (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
>...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).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.