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


von O. A. (sokrates1989)


Angehängte Dateien:

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.
1
;+------------------------------------------------------------------------------
2
;| Titel : Aufgabe 1b
3
;| Prozessor : ATmega8
4
;| Frequenz : 3,6864 MHz
5
;| Datum :
6
;| Autor : 
7
;| Guppe :
8
;|
9
;| ...
10
;+------------------------------------------------------------------------------
11
12
.include "m8def.inc" 
13
.DEF temp = r17
14
.DEF akku = r18
15
16
;-------------------------------------------------------------------------------
17
; Reset and Interruptvectoren ; VNr. Beschreibung
18
begin:
19
 
20
rjmp main ; 1 POWER ON RESET
21
reti ; 2 Int0-Interrupt
22
reti ; 3 Int1-Interrupt
23
reti ; 4 TC2 Compare Match
24
reti ; 5 TC2 Overflow
25
reti ; 6 TC1 Capture
26
reti ; 7 TC1 Compare Match A
27
reti ; 8 TC1 Compare Match B
28
reti ; 9 TC1 Overflow
29
reti ; 10 TC0 Overflow
30
reti ; 11 SPI, STC Serial Transfer Complete
31
reti ; 12 UART Rx Complete
32
reti ; 13 UART Data Register Empty
33
reti ; 14 UART Tx Complete
34
reti ; 15 ADC Conversion Complete
35
reti ; 16 EEPROM Ready
36
reti ; 17 Analog Comparator
37
reti ; 18 TWI (I²C) Serial Interface
38
reti ; 19 Store Program Memory Ready
39
;--------------------------------------------------------------------------
40
41
; Start
42
43
main: 
44
45
ldi r16 , LOW(RAMEND)   ; Init Stackpointer Low
46
out SPL , r16       ; init Stack
47
ldi r16 , HIGH(RAMEND)   ; init Stackpointer High
48
out SPH , r16       ; init Stack
49
50
ldi r19, 0x00
51
out DDRB, r19      
52
ldi akku, 10
53
54
55
mainloop:
56
57
marke: 
58
59
mov temp, akku
60
out PORTB, temp
61
dec temp
62
mov akku, temp
63
brne marke
64
65
ldi temp, 10
66
mov akku, temp
67
68
rjmp mainloop

von Heinz V. (heinz_v)


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).

von c-hater (Gast)


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

von Michael U. (amiga)


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

von O. A. (sokrates1989)


Lesenswert?

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

das war mir nicht ganz klar.
Danke.

von spess53 (Gast)


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

von O. A. (sokrates1989)


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.

von O. A. (sokrates1989)


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.

von O. A. (sokrates1989)


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?

von Rufus Τ. F. (rufus) Benutzerseite


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.

von spess53 (Gast)


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

von Michael U. (amiga)


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_Befehls%C3%BCbersicht

Gruß aus Berlin
Michael

von Thosch (Gast)


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.

von c-hater (Gast)


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

von LostInMusic (Gast)


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).

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.