2016-06-05 13 views
1

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

0

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.