Flags bei bedingten Sprüngen

Kapitel 4 „Hardwarenahe Programmierung in Assembler“

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Flags bei bedingten Sprüngen
Hallo,

ich beschäftige mich aktuell mit dem Foliensatz „4 Hardwarenahe Programmierung in Assembler“.
Die Folie 23 bereitet mir einiges Kopfzerbrechen.

Hier gibt’s erst mal das PDF:

http://www3.informatik.uni-erlangen.de/Lehre/GRa/SS2014/Gra_Kap_4.pdf

Ich taste mich mal vorsichtig voran:

JUMP EQUAL: Auf der vorherige Folie steht : „Subtraktion ermittelt Flags für Vergleiche“.
Zero = 1 → Das heißt, das Ergebnis der Subtraktion war Null,
damit sind beide Zahlen gleich,
und damit ist es eben equal.

JUMP NOT EQUAL: Zero=0 → Das Ergebnis der Subtraktion war verschieden
von Null, damit sind die Zahlen ungleich

JUMP GREATER: Zero=0 & Overflow = Sign

Der erste Teil sorgt halt dafür, dass es nicht gleich ist, also echt
größer.
Der zweite Teil sorgt dafür dass es größer ist.
aber so ganz versteh ich es nicht. Sign ist das Vorzeichen des
Ergebnisses der Subtraktion.
Overflow ist der Überlauf bei der Addition. mit der Addition ist wohl die
Subtraktion gemeint,
denn diese wird ja auf eine Addition mit zweier Komplement abgebildet.
hmmm und wenn beides gleich ist, dann ist es größer?
Also wenn dann sign =1 ist, dann ist ja das Vorzeichen negativ, also das
Ergebnis negativ.
Und immer wenn das Ergebnis negativ ist, dann hat ein Überlauf statt
gefunden ??
Ich steh aufm Schlauch …

bei JLE hab ich vielleicht sogar einen Fehler gefunden:
es soll kleiner gleich sein.
dafür steht da sign!= overflow, das steht für kleiner.
dann steht noch da ODER Zero=0.
Wenn Zero=0 ist, dann sind sie aber UNGLEICH!
Und es ist eine ODER Verknüpfung,
das würde bedeuten sobald die Zahlen ungleich sind, sind sie kleiner
gleich
ABER DAS IST FALSCH!!!

Hier muss meiner Meinung nach stehen

Sign != Overflow | Zero =1

Denn wenn Zero=1 ist, war das Ergebnis 0 (Verwirrend ich weiß), dann sind
die Zahlen gleich,
und dann ist es automatisch auch kleiner gleich.

Das mit dem Carry irritiert mich auch noch etwas, aber belasse es mal fürs erste dabei.

Was meint ihr ?



Hier findet sich etwas ausführlichere Behandlung:
http://en.wikibooks.org/wiki/X86_Assembly/Control_Flow
http://www.godevtool.com/GoasmHelp/usflags.htm

Richtig. Danke. Wer weiß, seit wie vielen Generationen der Fehler unentdeckt geblieben ist oder einfach nicht mitgeteilt wurde. JB und JBE waren auch nicht, wie sie sein sollten.


Oh danke! Krieg ich dafür jetzt Bonuspunkte für die Klausur ? hihi

Gell! Die kamen mir auch total komisch vor , hihi =)

Und da hab ich gleich noch ne Frage:

Was bedeuten denn immer die Kommata ?
Bei ja steht

bei jbe steht

Ich erwarte, dass hier ne logische Verknüpfung steht, sowas wie UND oder ODER, aber hier steht jeweils immer ein Komma , was soll das bedeuten?

Okay, ich taste mich mal wieder voran:

Bei JA muss das Komma wohl durch ein & ersetzt werden:

JA Carry = 0 & Zero =0 (echt größer)

Und bei JBE muss das Komma wohl durch ein | ersetzt werden

JBE Carry = 1 | Zero = 1 (kleiner gleich)

Was meint ihr ?


Keine Rückmeldungen zur Kommafrage?


Ja, so wie du es hast stimmt es.

Siehe auch hier: en.wikibooks.org/wiki/X86_Assembly/Control_Flow


Wenn meins stimmt dann wünsche ich mir dass es auch in die Folien eingetragen wird.
Mit Komma machts ja irgendwie nur eingeschränkt Sinn, oder ?


Dein Wunsch ging in Erfüllung.

1 Like