比较设置只有一个标志

时间:2016-06-05 19:34:33

标签: assembly x86

我试图避免我的循环中的寄存器标志依赖性,我认为是否有任何比较指令用于设置CF或OF标志的整数。 只有那些旗帜。重要的事实是:一个操作数是否更大,因此一位就足够了。

1 个答案:

答案 0 :(得分:0)

不,没有。你究竟要避免什么?所有CPU(P4除外)分别重命名EFLAGS的不同部分,因此inc doesn't have a false dependency on the old value of EFLAGS。通常当你想循环而不修改标志时,你试图保留CF。 (对于adc循环,或者将一个寄存器中的位一次移位到CF。)

您可以使用leajrcxz循环而不影响标记,但是对于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或其他内容“保存”一个标记,然后使用某种testsub dl, 1来生成标记。

要准确完成问题所要求的内容(有条件地设置CF而不影响其他人),请在jrcxz上使用该分支有条件地运行stcclc来设置或清除CF

另请参阅标记wiki。