JG, JGE, JL, JLE - CMP
-
Kann wer die Sprungbefehle die nach einem vergleich
mit vorzeichenbehafteten Zahlen folgen erklären.Oder besser gesagt kann wer CMP mit vorzeichenbehafteten
Zahlen erklären.Wann und warum wird "Overflow" und "Sign" gesetzt?
Bitte so erklären, dass man es leicht durchschaut.
Danke.
-
Hi.
Leicht durchschauen ist gut...
Kommt nun darauf an, wozu du diese jumps im Zusammenhang mit cmp missbrauchen willst. Ansonsten braucht es dich normalerweise schliesslich nicht interessieren, wann bei einem cmp nun genau welches Flag gesetzt wird.
Von ihren Namen her sind die bedingten Spruenge schliesslich selbsterklaerend...
zB.:
jg : jump if greater
jge : jump if greater or equal
jl : jump if less
jle : jump if less or equal
Die Gegenstuecke dazu bei vorzeichenlosen Ganzzahlen sind dann:
ja, jae, jb, jbeWenn dich die Flags beim cmp nun wirklich so brennend interessieren:
Halte dir vor Augen, dass cmp im Grunde genommen so wie "sub" funktioniert, nur dass eben nur die Flags gesetzt werden und das Ergebnis der Rechnung verworfen wird. Die Flags werden den Eigenschaften des Ergebnisses/Problemen bei der Rechnung entsprechend gesetzt.
-
sign ist einfach nur das vorzeichen eines ergebnisses, entspricht also immer dem höchstwertigen bit. overflow wird bei befehlen mit zwei operanden gesetzt, wenn das exakte ergebnis nicht in einen signed integer der entsprechenden grösse passt.
overflow signalisiert also wrap-around am min(signed)/max(signed) ende des wertebereichs während carry bei einem wrap-around am 0/max(unsigned) ende gesetzt ist. für die reine sprungsyntax muss dich das allerdings nicht interessieren, die namen der bedingten sprünge sind eigentlich selbsterklärend (wenn einmal den unterschied zwischen less and below erkannt hat).