Forum: Mikrocontroller und Digitale Elektronik Zero Flag und Conditional Branches


von Luqman K. (scorpions411)


Lesenswert?

Hallo Leute,

ich habe gerade das Forum durchsucht weil ich nach einer Antwort suche.

Es geht darum, was von einem conditional branche überprüft wird.
Wird das Ergebnis der Rechenoperation davor überprüft, oder der Status 
des Zeroflags ?
Ich habe folgende Antwort von einem Forummitglied gefunden:

Hi,
so wie ich dass verstehe. Werten die BRNE und BREQ das Z-Flag aus im
Register SREG aus. BRNE setzt den Programmcounter mit der
Sprungmarke(durch Assembler eine Adresse) bei Z=0 fort. Bei BREQ
erfolgt das bei Z=1. (vgl. Datasheet Atmel Instruction Set)
Das Z-Flag wird immer nur dann Z=1, wenn das Ergebnis einer Operation
(Vergleich,inc,dec...) gleich 0 ist.
So lassen sich die Befehle BRNE, BREQ vielfältig einsetzen in
Verbindung mit den vorhergehenden Operationen.


Dieser Beitrag wurde von anderen Usern bestätigt, ergibt jedoch für mich 
keinen Sinn. Es ist doch genau Umgekehrt wie von dem User beschrieben.
Hier sein Zitat:

Hi,
"BRNE setzt den Programmcounter mit der Sprungmarke(durch Assembler eine 
Adresse) bei Z=0 fort. Bei BREQ erfolgt das bei Z=1."


BRNE : Branche if not equal.
Wenn das Ergebniss der Rechenoperation davor =0 war, dann wird doch das 
Z-Flag gesetzt und ist somit Z=1. Also springt BRNE bei Z=1.

Wenn ich schonmal ein neuen Thread eröffne dann stelle ich gleich eine 
zweite Frage :)

Was überbrüft BRNE wenn die vorige Rechenoperation ADIW war. Also 
Addition einer Hexzahl. Sagen wir mal es kam 30 raus. Was bedeutet das 
für unser Ergebniss ist es true oder false ?

Vielen lieben Dank im Voraus.
Wünsche allen ein schönes WE.

von (prx) A. K. (prx)


Lesenswert?

Luqman K. schrieb:
> Was überbrüft BRNE wenn die vorige Rechenoperation ADIW war.

Weshalb wird das Z(ero) Flag wohl so heissen?

> Das Z-Flag wird immer nur dann Z=1, wenn das Ergebnis einer Operation
> (Vergleich,inc,dec...) gleich 0 ist.

Ebendies. Meistens. Bei SBC und CPC wirds etwas komplizierter.

> Wird das Ergebnis der Rechenoperation davor überprüft, oder der Status
> des Zeroflags ?

Wie aus der Befehlsbeschreibung von BRxx eindeutig hervorgeht, werden 
die betreffenden Flags geprüft. Wodurch auch immer die zuletzt gesetzt 
wurden. Das kann der Befehl direkt vorher sein, aber auch ein früherer.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Luqman K. schrieb:

> [...]
> Es geht darum, was von einem conditional branche überprüft wird.
> Wird das Ergebnis der Rechenoperation davor überprüft, oder der Status
> des Zeroflags ?

Ich meine zwar, zu wissen worauf Du hinaus willst. Aber die Frage ist 
dazu nicht passend gestellt.

Es gibt mehrere Arten von bedingten Sprüngen. Sie unterscheiden sich zum 
einen darin, von welchem Flag ihr Verhalten abhängig ist und darin ob 
sie nun die Ausführung an einer neuen Stelle weiterführen, wenn das Flag 
gesetzt ist oder wenn das Flag gelöscht ist.

Das ist Dir, soweit ich das erkennen kann, wohl schon klar. Aber die 
Frage kann daher nicht allgemein auf bedingte Sprünge gestellt und 
beantwortet werden.

Wenn ich Deine Frage mal neu formulieren darf:

"Es geht darum, was von einem conditional branch, der vom Zero-Flag 
abhängt, überprüft wird.
Wird das Ergebnis der Rechenoperation davor überprüft, oder der Status
des Zeroflags?"

Es wird der Status des Z-Flags geprüft.

In der Beschreibung der Befehle siehst Du eine Liste, in der beschrieben 
wird, ob ein bestimmtes Flag überhaupt verändert wird und in welcher 
Weise das von den Operanden bzw. vom Ergebnis abhängt.
Es gibt z.B. Befehle die das Z-Flag nicht beeinflussen. Dann hat das 
Z-Flag denjenigen Zustand, der von dem letzten Befehl, der das Z-Flag 
beeinflusst hat, abhängt.

> Ich habe folgende Antwort von einem Forummitglied gefunden:
>
> Hi,
> so wie ich dass verstehe. Werten die BRNE und BREQ das Z-Flag aus im
> Register SREG aus. BRNE setzt den Programmcounter mit der
> Sprungmarke(durch Assembler eine Adresse) bei Z=0 fort. Bei BREQ
> erfolgt das bei Z=1. (vgl. Datasheet Atmel Instruction Set)
> Das Z-Flag wird immer nur dann Z=1, wenn das Ergebnis einer Operation
> (Vergleich,inc,dec...) gleich 0 ist.
> So lassen sich die Befehle BRNE, BREQ vielfältig einsetzen in
> Verbindung mit den vorhergehenden Operationen.
>
>
> Dieser Beitrag wurde von anderen Usern bestätigt, ergibt jedoch für mich
> keinen Sinn. Es ist doch genau Umgekehrt wie von dem User beschrieben.
> Hier sein Zitat:
>
> Hi,
> "BRNE setzt den Programmcounter mit der Sprungmarke(durch Assembler eine
> Adresse) bei Z=0 fort. Bei BREQ erfolgt das bei Z=1."

Dieses Zitat sagt genau das selbe aus, wie das darüber stehende Zitat. 
Es ist sogar identisch mit einem Teil des Zitats. Wo siehst Du da einen 
Unterschied?

> BRNE : Branche if not equal.
> Wenn das Ergebniss der Rechenoperation davor =0 war, dann wird doch das
> Z-Flag gesetzt und ist somit Z=1. Also springt BRNE bei Z=1.

Diese Schlussfolgerung ist falsch und es ist auch unklar, worauf sie 
beruht. Erkläre das mal.

> Was überbrüft BRNE wenn die vorige Rechenoperation ADIW war. Also
> Addition einer Hexzahl. Sagen wir mal es kam 30 raus. Was bedeutet das
> für unser Ergebniss ist es true oder false ?

BRNE überprüft IMMER das Z-Flag, egal welche Operationen vorher erfolgt 
sind. Es weiss sozusagen nicht, was die vorherige Operation war.

ADIW beeinflusst das Z-Flag. Das Z-Flag wird gesetzt wenn das Ergebnis 
der Addition Null ist.

von Luqman K. (scorpions411)


Lesenswert?

Vielen Dank für die schnellen Rückmeldungen.
Ich habe vor lauter Bäumen den Wald nicht gesehen.
Es macht wesentlich mehr Sinn jetzt.

Prima erklärt a.k. und vor allem theor.

von Theor (Gast)


Lesenswert?

Ergänzend kann man noch folgendes hinzufügen:

Die Befehle "BREQ" (Branch if equal) und "BRNE" (Branch if not equal) 
sind nicht in Bezug auf alle Befehle wortwörtlich so zu verstehen, 
dass sie springen bzw. nicht springen, wenn die Operanden gleich bzw. 
ungleich sind.


Gegenbeispiele lassen sich leicht finden:

So wird ein Bitweises "Und" von 0xF0 und 0x0F das Z-Flag setzen (weil 
das Resultat Null ist. Ein anschliessendes BREQ (das springt, wenn Z 
gesetzt ist) wird aber nicht deswegen springen, weil die Operanden 
tatsächlich gleich waren; sie waren es ja nicht.


Das kann evtl. am Anfang zu Verwirrungen führen.
In der Befehlsbeschreibung von BREQ und BRNE ist deswegen auch 
beschrieben, dass dieser Befehl nach den Befehlen CP, CPI, SUB, oder 
SUBI (dazwischen dürfen natürlich nur Befehle stehen, die Z nicht 
beeinflussen), abhängig davon springt ob die Operanden gleich (BREQ) 
oder ungleich (BRNE) waren. Davon ob die Operanden gleich oder ungleich 
waren wird in Bezug auf andere Operationen nichts gesagt (und was in 
Datenblättern nicht ausdrücklich gesagt wird ist auch nicht 
vorauszusetzen [auch wenn es manchmal trotzdem zutrifft]).

Ein anderes Beispiel ist der erwähnte ADIW-Befehl. Selbst wenn das 
Ergebnis Null ist, etwa weil zu 0xFE noch 1 dazu addiert wurde, heisst 
eine Sprung durch BREQ nicht das die Operanden gleich waren.

Das kann unter Umständen ein paar Mal zu Verwirrung führen, ehe man sich 
klar macht, dass die Bezeichnungen BRNE und BREQ sich sinngemäß eben nur 
auf die Ergebnisse von CP, CPI, SUB, or SUBI anwenden lassen. In allen 
anderen Fällen muss muss man sich BREQ als BREQZ(Branch if result equal 
to Zero) bzw. BRNEZ (Branch if result not equal to Zero) denken.

Allerdings tue ich das gedanklich nicht so, weil es sich nach den ersten 
zwei oder drei Fällen in denen man darüber anfängt nachzudenken dann 
doch irgendwie einprägt, das es auf das Resultat ankommt, auch wenn es 
nicht irgendwo gespeichert wird (denn z.B. CP führt zwar eine 
Subtraktion durch, weist aber das Ergebnis keinem Register zu). Ein 
Vergleich ist demnach lediglich eine Operation bei der die Differenz 
Null ist, wenn die Operanden gleich sind und unterscheidet sich darin in 
keiner Weise etwa von dem Bitweisen-Und bei dem auch möglicherweise Null 
herauskommt.

von Theor (Gast)


Lesenswert?

Ups. Dieser eine Absatz über ADIW muss natürlich so lauten:

Ein anderes Beispiel ist der erwähnte ADIW-Befehl. Selbst wenn das
Ergebnis Null ist, etwa weil zu 0xFFFF noch 1 dazu addiert wurde, heisst
                                  ^^^^
eine Sprung durch BREQ nicht das die Operanden gleich waren.

Sorry.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Theor schrieb:
> Allerdings tue ich das gedanklich nicht so, weil es sich nach den ersten
> zwei oder drei Fällen in denen man darüber anfängt nachzudenken dann
> doch irgendwie einprägt, das es auf das Resultat ankommt, auch wenn es
> nicht irgendwo gespeichert wird (denn z.B. CP führt zwar eine
> Subtraktion durch, weist aber das Ergebnis keinem Register zu). Ein

 Nein, es kommt eben nicht auf das Resultat an.

 Es wird einzig und allein Zeroflag geprüft. Zeroflag kann aber auch
 10 Befehle vorher gesetzt bzw. zurückgesetzt worden sein.

 Unter anderem beeinflussen Jump, Bit Set und Reset, Load Befehle etc.
 den Zeroflag überhaupt nicht.

 Und es gibt gerade deswegen den Befehl SEZ (Set Zero Flag) und
 CLZ (Clear Zero Flag).

von H.Joachim S. (crazyhorse)


Lesenswert?

Ja, die kleinen Hässlichkeiten, man muss manchmal höllisch aufpassen :-)
Am besten überlässt man den ganzen Quark einem Compiler, der kann das 
besser und irrt sich i.a. nicht.

Auch eine Falle: R16=0xff
inc R16
setzt zwar das zero-flag, aber nicht das carry-flag, wie man erwarten 
könnte.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

H.Joachim S. schrieb:
> Auch eine Falle: R16=0xff
> inc R16
> setzt zwar das zero-flag, aber nicht das carry-flag, wie man erwarten
> könnte.

 AVR hat keinen ADI oder ADDI Befehl (Add immediate).

 So artet auch dies zu einer Falle:
1
 ldi  r16, 0xFF
2
 subi r16, -1

 Aber folgendes:
1
 ldi  r16, 0xFF
2
 ldi  r17, 0x01
3
 add  r16, r17
 lässt einen nicht in diese Falle tappen.


> Ja, die kleinen Hässlichkeiten, man muss manchmal höllisch aufpassen :-)

 Genau.


 P.S.
 INC und DEC wird meistens bei loop counter oder so benutzt, da kommt
 es nicht darauf an.

: Bearbeitet durch User
von Theor (Gast)


Lesenswert?

Marc V. schrieb:
> Theor schrieb:
>> Allerdings tue ich das gedanklich nicht so, weil es sich nach den ersten
>> zwei oder drei Fällen in denen man darüber anfängt nachzudenken dann
>> doch irgendwie einprägt, das es auf das Resultat ankommt, auch wenn es
>> nicht irgendwo gespeichert wird (denn z.B. CP führt zwar eine
>> Subtraktion durch, weist aber das Ergebnis keinem Register zu). Ein
>
>  Nein, es kommt eben nicht auf das Resultat an.

Ich halte Deinen Einwand, mit Verlaub, für irrelevant.

Ich will die Möglichkeit einräumen, dass eine Unklarheit, ein 
Mißverständnis die Ursache ist, aber insofern die nachfolgenden Sätze 
eine Klarstellung bewirken sollen, muss ich feststellen, dass sie nichts 
feststellen, was ich nicht auch schon geschrieben habe und sie daher 
Deinen Einwand nicht präzisieren.

Für irrelevant halte ich ihn deswegen, weil sich der Teilsatz "das es 
auf das Resultat ankommt" als Teil eines Absatzes auf diejenigen 
Resultate bezieht, für die ich die Frage aufgeworfen habe und 
diskutiere, ob und in welcher Weise mit der Tatsache umgegangen wird, 
dass die wörtliche Bedeutung von BREQ und BRNE nicht in jedem Fall auf 
die Gleichheit bzw. Ungleichheit von Operanden abzielt. Also auf die 
Resultate gewisser vorhergehender Operationen (nicht wie Du 
nachfolgend ausführst auf alle Operationen).

Aus dem Kontext und insbesondere meiner Aussage:
"In der Beschreibung der Befehle siehst Du eine Liste, in der 
beschrieben
wird, ob ein bestimmtes Flag überhaupt verändert wird und in welcher
Weise das von den Operanden bzw. vom Ergebnis abhängt.
Es gibt z.B. Befehle die das Z-Flag nicht beeinflussen."

wird eindeutig klar, dass mir bewusst ist und ich dies dem TO auch 
mitteilen will, dass nicht alle Operationen das Z-Flag setzen. Daraus 
lässt sich unschwer schliessen, auch wenn ich das nicht ausdrücklich 
schreibe, das nicht alle Resultate aller Operationen mit dem setzen bzw. 
löschen des Z-Flags einhergehen.

Der Einwand ist also insofern irrelevant, als die in Rede stehenden 
Resultate für den Zweck meines Diskurses ohnehin durch meine 
vorhergehenden Aussagen auf jene beschränkt waren, die durch Operationen 
erzeugt werden, die das Z-Flag beeinflussen.

>  Es wird einzig und allein Zeroflag geprüft.

Ziemlich genau das habe ich hier:
"Es wird der Status des Z-Flags geprüft"
und hier:
"BRNE überprüft IMMER das Z-Flag, ..."
geschrieben.

Nicht ganz, aber Deine Formulierung wäre aus meiner Sicht nur dann 
sinnvoll, wenn es nicht nur offen sondern auch fraglich geblieben wäre, 
ob nicht auch andere Flags oder auch andere Register geprüft würden 
könnten. Das aber war weder die Frage des TOs, noch ergab sich aus der 
Fragestellung, dass dieser Punkt, obwohl nicht ausdrücklich genannt, 
wichtig sein könnte.
Man konnte vielmehr plausibel annehmen, dass der TO davon ausgeht, dass 
BRNE ausschliesslich das Z-Flag testet und da das so völlig zutreffend 
ist, ergab sich auch keine Notwendigkeit das ausdrücklich zu erwähnen um 
etwa ein Fehlverständnis zu korrigieren oder ähnliches.

>  Zeroflag kann aber auch
>  10 Befehle vorher gesetzt bzw. zurückgesetzt worden sein.
>  Unter anderem beeinflussen Jump, Bit Set und Reset, Load Befehle etc.
>  den Zeroflag überhaupt nicht.

Genau dies (mit der Einschränkung, dass ich es unterlassen habe einzelne 
Befehle zu nennen) habe ich hier geschrieben:
"Es gibt z.B. Befehle die das Z-Flag nicht beeinflussen. Dann hat das
Z-Flag denjenigen Zustand, der von dem letzten Befehl, der das Z-Flag
beeinflusst hat, abhängt."

>  Und es gibt gerade deswegen den Befehl SEZ (Set Zero Flag) und
>  CLZ (Clear Zero Flag).

Diesen Absatz von Dir kommentiere ich hier nicht, weil ich nicht 
erkennen kann, in welcher Weise er, Deinen Einwand:

>  Nein, es kommt eben nicht auf das Resultat an.

oder eine der nachfolgenden Aussagen stützen soll.

Insgesamt will ich folgendes sagen: Meine beiden Beiträge hier nahmen 
jeden Deiner Einwände vorweg und meine Verwendung des Ausdrucks "das es 
auf das Resultat ankommt" muss meiner Meinung nach in dem Kontext dieser 
Punkte und insgesamt der beiden Beiträge gelesen werden.

Die Alternative wäre, vor jedem Satz, den man schreibt und der von der 
Sache handelt, hinzuzufügen, dass für das folgende aller vorher 
gemachten Aussagen (und Meinungen etc.) nach wie vor uneingeschränkt 
gelten sollen.

Das aber sollte, meiner Ansicht nach, unter verständigen und 
vernünftigen Leuten nicht nötig sein. Es versteht sich meiner Erfahrung 
nach von selbst, dass hypothetische Annahmen, die nur für einen Teil der 
nachfolgenden Argumentation gelten sollen, als solche gekennzeichnet, 
bzw. an einem späteren Punkt im Text ausdrücklich aufgehoben werden.

Noch kürzer: In dem Teilsatz "das es auf das Resultat ankommt" meint 
"Resultat" meiner Meinung nach völlig zweifelsfrei, eindeutig und klar, 
genau diejenigen Resultate genau und ausschliesslich jener Operationen 
auf die eine Diskussion über Bedeutung und Anwendung von BRNE und BREQ 
überhaupt anwendbar ist.

Wie siehst Du das? Hälst Du meine in diesem Beitrag genannten Einwände 
gegen Deinen Beitrag für treffend? Und hälst Du Deinen Einwand immer 
noch für relevant? Wenn ja, würde mich interessieren, warum.

von Theor (Gast)


Lesenswert?

Ich muss gerade grinsen, denn ich muss Dir ganz offen gestehen, dass ich 
Dich schon längere Zeit in meinen CSS File filtere und mehr oder weniger 
zufällig mal wieder was von Dir lese.

Um es mal so auszudrücken. Ich kann Deinen Gedankengängen so gut wie nie 
folgen; was bewirkt, dass ich ihnen eben so wenig etwas nützliches 
entnehmen kann.

Das ist, zugegeben, eine etwas unverblümte Ausdrucksweise und es ist 
fraglich ob ich erwarten darf, dass Du ihr ebenso offen begegnen kannst.

Aber jetzt, wo ich mal auf Dich eingegangen bin, interessiert mich das 
doch, ob ich ein wenig davon herauskriegen kann, wie Du so tickst.

Falls Du willst ...

Marc V. schrieb:
> H.Joachim S. schrieb:
>> Auch eine Falle: R16=0xff
>> inc R16
>> setzt zwar das zero-flag, aber nicht das carry-flag, wie man erwarten
>> könnte.
>
>  AVR hat keinen ADI oder ADDI Befehl (Add immediate).

Das verstehe ich nicht. Es hat ja niemand behauptet, dass der AVR einen 
ADI oder ADDI Befehl hat. Und wie verhält sich Dein Einwand zu der 
Tatsache, dass der AVR einen ADIW Befehl hat (die wortweise Addition 
eines Immediates)?

>  So artet auch dies zu einer Falle:
>
1
>  ldi  r16, 0xFF
2
>  subi r16, -1
3
>

Was ist daran die Falle? Geht es noch um das Carry-Flag?

>  Aber folgendes:
>
1
>  ldi  r16, 0xFF
2
>  ldi  r17, 0x01
3
>  add  r16, r17
4
>
>  lässt einen nicht in diese Falle tappen.
>
>

[...]

>  P.S.
>  INC und DEC wird meistens bei loop counter oder so benutzt, da kommt
>  es nicht darauf an.

Das fasse ich genau umgekehrt auf.
INC und DEC setzen gerade deswegen, damit man sie in arithmetischen 
Schleifen verwenden kann, nicht das Carry-Flag. Genau das ist auch bei 
INC und DEC in der Befehlsbeschreibung ausdrücklich beschrieben.

von (prx) A. K. (prx)


Lesenswert?

H.Joachim S. schrieb:
> setzt zwar das zero-flag, aber nicht das carry-flag, wie man erwarten
> könnte.

Wobei das für INC Befehle vieler Architekturen gilt.

von ASM Superprofi (Gast)


Lesenswert?

Leute...........

statt hier seitenlang rumzudiskutieren, erwähnt doch für den armen TO 
einfach mal die Existenz des AVR ARM Reference Manual von Atmel. Da 
steht für jeden Befehl exakt beschrieben drin, was er tut, welche Flags 
er setzt und welche Flags er auswertet. Weder mehr noch weniger ist 
notwendig, um den AVR ASM zu verstehen und richtig anzuwenden.

von ASM Superprofi (Gast)


Angehängte Dateien:

Lesenswert?

ARM sollte natürlich ASM heissen. Ist noch früh.

Am besten ich lade es einfach mal hoch.

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Und um die Verwirrung komplett zu machen:
Beim 286er unter DOS hieß der entsprechende Befehl JZ (jump zero) bzw 
JNZ (jump not zero) - was ich als 'klarer' empfinde.
(gabs für die anderen Flags auch, z.B. JC für Carry)

Selber habe ich mir die Befehlsliste meines aktuellen Opfer ausgedruckt 
und um so Kleinigkeiten wie benutzbare Register ergänzt.

So ist bei mir ersichtlich, daß der ATtiny45 beim Befehl CPI gerne ein 
Register 16-31 und einen Wert von 0-255 hätte.
(Seite 202 im Manual des ATtiny25/45/85 Datasheet)

Ansonsten finde ich die aufgelisteten Operationen ganz brauchbar, z.B.
BREQ:
if (Z=1) then PC=PC+k+1
sagt aus, daß bei gesetztem Z-Flag der PC um k erhöht wird (bei 
negativem k erniedrigt)

(bei mir steht noch, daß k -64 bis 63 betragen darf, wird aber vom 
Studio angemeckert, wenn die Sprungreichweite nicht passt)

MfG

von (prx) A. K. (prx)


Lesenswert?

Patrick J. schrieb:
> (gabs für die anderen Flags auch, z.B. JC für Carry)

BRCC/BRCS gibts bei AVR auch.

Aber Obacht! Bei vielen Architekturen entspricht ein Sprung auf 
"unsigned lower" nach einem Compare einem gesetzten Carry, bei manchen 
aber einem gelöschten Carry. Drum fährt man mit BRLO/JLO/BLO besser als 
mit BRCS(AVR), JC(x86), BCC(ARM).

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Patrick J. schrieb:
> Beim 286er unter DOS hieß der entsprechende Befehl JZ (jump zero) bzw
> JNZ (jump not zero)

Beim 8051 ebenso.
Oder JC bzw. JNC (Carry)


> - was ich als 'klarer' empfinde.

dito.


Gruß

Jobst

von (prx) A. K. (prx)


Lesenswert?

Gilt diese Vorliebe für Jx/JNx auch für die JP/JNP Befehle von x86?

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

P? Sagt mir akut Nix :/

Und Vorliebe ist wohl falsch.
Ich habe kein Problem damit, BREQ einzugeben, wenn ich auf das Zero-Flag 
prüfen will.
'Sprung wenn gleich' passt ja sogar auch, wenn man sich vor Augen hält, 
daß bei einem Vergleich (CP) beide Werte voneinander abgezogen werden 
und wenn das Ergebnis 0 ist (das Zero-Flag gesetzt wurde), sind die 
beiden Werte gleich.

Beim Quelltext lesen muß man halt mitdenken, ob hier auf Gleichheit oder 
auf Flag getestet wird.
Hab auch schon gesehen, daß man sich 'JZ' als Makro erstellt und im 
Makro dann auch gleich prüft, ob der Sprung möglich ist (Entfernung <64) 
und wenn nein, per negierter Abfrage über einen rjmp drüber springt.

Als Erklärung ein Makro von
1
; Makros für AVR-Assemblerprogramme
2
; Dr. Michael Schramm Softwareentwicklung
3
; www.schramm-software.de
4
..... weitere Macros ...
5
.macro next_up ;(reg, endwert, label)
6
  inc @0
7
  cpi @0,@1
8
.if pc-@2 < 64  ;(original .if pc-@1 < 64)
9
  brne @2
10
.else
11
  breq pc+2
12
  rjmp @2
13
.endif
14
.endmacro
15
..... weitere Macros ...
Makro ist das Pendant zum 'NEXT' einer For-Next-Schleife,
Ab der Zeile *.if pc-02 < 64* wird es interessant.
Dort wird, wenn das Sprungziel erreichbar ist, direkt auf Ungleichheit 
geprüft.
Ist das Sprungziel (das FOR dieser Schleife) aber weiter als 64 Wörter 
entfernt, wird auf Gleichheit geprüft und wenn Gleich, dann der Sprung 
zum FOR übersprungen.

MfG

von Route_66 H. (route_66)


Lesenswert?

Jobst M. schrieb:
> Beim 8051 ebenso.
> Oder JC bzw. JNC (Carry)

Wobei der Vergleich mit dem 8051 hier fehl am Platz ist: dort wird über 
den Sprung entschieden, wenn der ACCU gleich oder ungleich Null ist. Das 
Z-Flag hat keinen Einfluss!
Das Z-Flag kann dort aber auch als Bedingung verwendet werden - über den 
JB... und JNB... Befehl.

von (prx) A. K. (prx)


Lesenswert?

Patrick J. schrieb:
> P? Sagt mir akut Nix :/

Das Parity-Flag. JP springt also, wenn das Flag gesetzt und JNP wenn es 
nicht gesetzt ist. Spätestens hier werden viele auf die alternativen 
Mnemonics JPE/JPO ausweichen.

: Bearbeitet durch User
von Jobst M. (jobstens-de)


Lesenswert?

Route 6. schrieb:
> dort wird über
> den Sprung entschieden, wenn der ACCU gleich oder ungleich Null ist. Das
> Z-Flag hat keinen Einfluss!

Was eigentlich keinen Unterschied macht ...


Route 6. schrieb:
> Das Z-Flag kann dort aber auch als Bedingung verwendet werden - über den
> JB... und JNB... Befehl.

Nö, der 8051 hat nämlich gar kein Z Flag.


Gruß

Jobst

von Route_66 H. (route_66)


Lesenswert?

Jobst M. schrieb:
> Nö, der 8051 hat nämlich gar kein Z Flag.
>
> Gruß
>
> Jobst

Richtig!
Aber die bedingten Sprünge über bitadressierbare "Flags" sind dennoch 
ein Vorteil.

von Jobst M. (jobstens-de)


Lesenswert?

Route 6. schrieb:
> Richtig!
> Aber die bedingten Sprünge über bitadressierbare "Flags" sind dennoch
> ein Vorteil.

... und dabei kann ein Bit ein Portpin, eine RAMzelle, ein Bit des Akkus 
oder ein Kontrollregister sein.
Ich mag den auch! :-)

Gruß

Jobst

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.