Ich versuche, Register Flag Abhängigkeit in meiner Schleife zu vermeiden, und ich denke, gibt es eine Vergleichsanweisung für Integer, die nur CF oder OF-Flag gesetzt. Und nur diese Flaggen. Die wichtige Tatsache ist: Ist ein Operand größer oder nicht, so reicht das eine Bit aus.Vergleich Einstellung nur ein Flag
Antwort
Nein, gibt es nicht. Was genau willst du vermeiden? Alle CPUs (außer P4) benennen verschiedene Teile von EFLAGS einzeln um, also inc
doesn't have a false dependency on the old value of EFLAGS. Wenn Sie eine Schleife ohne Änderung einer Flagge erstellen möchten, ist es normalerweise CF
, die Sie beibehalten möchten. (Für eine adc
Schleife oder Verschieben von Bits aus einem Register in CF
eine nach der anderen.)
Sie kann Schleife ohne Fahnen an allen mit lea
und jrcxz
zu beeinflussen, aber das ist es nicht wert für eine adc
Schleife auf Intel SnB und später, wenn das partielle Flag-Merging schnell ist.
Aber wenn Sie ein tatsächliches vergleichen müssen, nicht nur ein Count-Down (like the slow loop
instruction), können Sie es wie folgt tun:
### Don't actually do this. This is just to illustrate how bad the best option is
# A in eax, B in ebx
movd xmm0, eax
movd xmm1, ebx
pcmpgtqd xmm0, xmm1 ; all-ones if eax>ebx (32bit signed compare), else all-0
movd ecx
jrcxz A_ngt_B
; fall-through path: A > B, ecx = -1
Dieses saugt viel, im Vergleich zu anderen Optionen. Es ist wahrscheinlich schlimmer, als einfach Flags mit sahf
/lahf
zu speichern/wiederherzustellen, oder das sogar langsamere pushf/popf
. Oft kann man eine Flagge mit einer setcc dl
oder so etwas "speichern", und dann eine Art test
oder sub dl, 1
, um einen Übertrag zu generieren oder nicht.
Um das zu erreichen genau das, was die Frage nach, verwenden Sie diesen Zweig auf jrcxz
bedingt läuft stc
oder clc
zu setzen oder zu löschen CF
(bedingt nur CF
ohne andere Einstellung zu beeinflussen).
Siehe auch die Tag Wiki.