我们正在比较两个值
1
和pi
然后我使用“如果高于则跳转”或如果更大则跳转:
我们有:
1 - pi < 0
所以我们不跳。
它只发生在条件:
x - value > 0
是真的,对吧?溢出标志在 jg 中是如何工作的?
fcomp ; st0:1 , st1:pi
fstsw ax
sahf
ja nie_odejmuj ;
我们跳吗?
使用 FPU
ja
需要 CF==0 和 ZF==0。它不检查OF。在 x87 标志中,这意味着 C0==0 和 C3==0。FCOM
使用,FCOMP
等进行比较的条件正是 ST(0) > ST(1) 。
您不应该与正式的条件差异(ja
比较无符号数)混淆,因为 x87 条件标志不同并且使用特殊传输在此处传递。甚至可以看到完全不匹配的条件,但英特尔试图提供至少在条件和检查指令之间非常相似的地方。
OTOH, ,是的,使用未使用+jg
传递的位检查其他条件。因此,即使名称与所需条件相同,也不适用于此处。fstsw
sahf
这是遗留问题,以及大量其他 x86 奇怪的解决方案。(30 多年没有从头开始重新设计的开发并没有给出一致的结果。OTOH,所有这些都有很好的记录,所以你应该遵循已知的食谱。)
更新:顺便说一句,您也可以直接跳过sahf
并检查标志:
fstsw ax
test ax, 4100h
jz nie_odejmuj
它在代码中更长,但更清楚地表达了方法。