Frage zum 'Zero-Flag' aus dem 'Flag-Register'

DerVonNebenan

Captain Special
Mitglied seit
20.08.2011
Beiträge
233
Renomée
1
Hallo,

ich befasse mich zur Zeit mit Assembling und hätte eine Frage zu dem 'Zero-Flag'.
Dabei wird u.a. geschreiben 'Ist das 'Zero-Flag' gesetzt, dann war das letzte Rechenergebnis gleich Null.'
Kann mir das jemand kurz erklären?
Welche Rechenergebnisse werden hier betrachtet?
Z.B. die Subtraktion zweier Zahlen

0000 1101 (Operand1)
- 0001 1010 (Operand2)
Ü 1 111 1
-------------
1111 0011

Bei dem Übergang vom 8-Bit auf den 9-Bit gibg es einen Übertrag. Im 'Flag-Register' wird demnach das 'Carry-Flag' von 0 auf 1 gesetzt.
Wie wird hier das 'Zero-Flag' betrachtet?

LG
 
Zuletzt bearbeitet:
Zero wird nicht gesetzt aber man kann ja das Zero Flag auch benutzen um zb zu verzweigen oder zu springen wenn ein Ergebnis nicht 0 ist.
Werde das aber auch mal überprüfen, bloss hier musste ich alles installieren, auf einen (alten) AMD 486 habe ich aber alles drauf, möchte den
aber erst anwerfen wenn es nicht so extrem heiss ist. LG :)
 
Zuletzt bearbeitet:
Das ist mir bekannt ;D
Mich stört eher immer die Aussage '... wenn ein Ergebnis nicht 0 ist ...'.
Das lese ich immer und immer wieder.
Was für ein Ergebnis ist denn hier gemeint?
Wenn ich oben die Subtraktion betrachte, bekomme ich eine Zahl als Ergebis.
Bei dem 'Zero-Flag' muss ja irgendein Ergebnis CPU intern gesetzt werden ...

LG
 
Zuletzt bearbeitet:
mov al, 0a ; 10
sub al, 0a ; -10

Ergebnis wäre 0

die Flags werden gesetzt weil eine Subtraktion stattgefunden hat das Ergebnis steht im al Register LG :)
 
Zuletzt bearbeitet:
Das Ergebnis dieser arithmetischen Operation (Subtraktion zweier Zahlen) wird als Zahl in das 'Al-Register' geschreiben.
Das hat doch nichts mit dem 'Flag-Register' zu tun.
Nehmen wir die Rechnung '15-10'. Das Ergebnis wäre '5' und wird als Zahl in das 'Al-Register' geschrieben.
Was passier hier im 'Flag-Register'?
 
Zuletzt bearbeitet:
100 + 28 habe ich zb extra genommen weil das Ergebnis nicht mehr in 7 Bit(s) reinpasst , also müsste hier das Carry Flag gesetzt werden , wenn man 8 Bit Register zur Berechnung nimmt, Zero wäre nicht gesetzt mmh gib es noch was , naja ohne ein Buch wo ich alles nachlesen kann ist es halt ein wenig schwierig , habe ich aber im Augenblick auch nicht
hier, (bin grad nicht zu hause) aber so ungefähr kommt es schon hin.
Grob gesagt (immer) wenn ein Wert in einem Register verändert wird werden die Flags gesetzt.

werde natürlich mal genauer nachsehen, bloss morgen habe ich auch noch ein wenig viel um die Ohren, spätestes die Tage danach
weiss ich es genauer , ich benutze ja auch immer nur die Befehle zb jns b20 (springe wenn nicht negativ(B20 wäre jetzt eine Sprungadresse))
oder um beim Zero Flag zu bleiben jnz b20 (springe wenn nicht 0 nach b20) LG :)
 
Zuletzt bearbeitet:
Erstmal Danke!
Mir geht es erstmal nur um diese besch**** 'Zero-Flag'.
Das mit dem u.a. 'CF' habe ich soweit verstanden.
Das 'ZF' ist sehr wichtig bei Sprüngen; ich finde zur Zeit noch keinen sinnvollen Bezug, wie das gesetzt wird.
Daher auch hier die Frage im Forum.
Auszug aus einem Buch:
'Dieses Flag zeigt an, ob das Ergebnis einer
Operation Null ist, oder nicht. Falls es Null ist, ist das „Zero Flag“ gesetzt, falls das Ergebnis
ungleich Null ist, wird es nicht gesetzt. Eine wichtige Benutzung des „Zero Flag“ aus der Sicht
eines „Crackers“ ist sicherlich, wenn aus einem Unterprogramm der Rückgabewert ermittelt
wird. Doch das ist für den Anfänger noch nicht so interessant.
'
Nach diesem Wortlaut gleichen sich alle bisher gefunden Erklärungen zum 'ZF'.

Wenn das wirklich so einfach ist:
Wird hier explizit immer das Endergebnis einer arithmetischen Operation betrachtet?
Also
'10-10=0' -> 'ZF' wird gesetzt
'100+28=128 ungleich Null' -> ZF' wird nicht gesetzt.

Anderes Beispiel:
Ich schreiben ein Programm. Wenn die Eingabe über die Tastatur nicht z.B. '8' ist, dann soll das Programm stoppen.
Wenn genau die '8' eingegeben wird, dann läuft das Programm über einen Sprung weiter.
Die Sprungabfrage wäre ja nicht anderes als eine rithmetischen Operation, in dem Fall eine Subtaktion.
'8-1=7 ungleich 0' -> 'ZF' nicht gesetzt -> Prorgramm stop
.
.
.
'8-8=0' -> 'ZF' wird gesetzt -> Programm weiter
 
Zuletzt bearbeitet:
Das Zero Flag ist mit ein_s der wichtigsten Flags finde ich, es müsste nicht nur von mir viel für Schleifen benutzt werden wo ein Register immer zb um -1 heruntergezählt
wird und dann die Schleife beendet wird wenn das Register den Wert 0 erreicht hat.
 
Berechnet die CPU bei Schleifen nicht auch eine Subtraktion?
Ich setze eine Schleifen mit 5 Durchgängen ...
'5-0=5 ungleich 0' -> 'ZF' wird nicht gesetzt -> nächster Schleifenschritt
'5-1=4 ungleich 0' -> 'ZF' wird nicht gesetzt -> nächster Schleifenschritt
.
.
.'5-5=0' -> 'ZF' wird gesetzt -> Schleife beendet
 
Zurück
Oben Unten