我试图避免我的循环中的寄存器标志依赖性,我认为是否有任何比较指令用于设置CF或OF标志的整数。 只有那些旗帜。重要的事实是:一个操作数是否更大,因此一位就足够了。
答案 0 :(得分:0)
不,没有。你究竟要避免什么?所有CPU(P4除外)分别重命名EFLAGS的不同部分,因此inc
doesn't have a false dependency on the old value of EFLAGS。通常当你想循环而不修改标志时,你试图保留CF
。 (对于adc
循环,或者将一个寄存器中的位一次移位到CF
。)
您可以使用lea
和jrcxz
循环而不影响标记,但是对于Intel SnB上的adc
循环以及之后的部分标记合并速度很快,这是不值得的
但如果您需要实际比较,而不仅仅是倒计时(like the slow loop
instruction),您可以这样做:
### 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
与其他选项相比,这很糟糕。这可能比仅使用sahf
/ lahf
或更慢的pushf/popf
保存/恢复标记更糟糕。通常,您可以使用setcc dl
或其他内容“保存”一个标记,然后使用某种test
或sub dl, 1
来生成标记。
要准确完成问题所要求的内容(有条件地设置CF
而不影响其他人),请在jrcxz
上使用该分支有条件地运行stc
或clc
来设置或清除CF
。
另请参阅x86标记wiki。