1

我们正在比较两个值 1pi

然后我使用“如果高于则跳转”或如果更大则跳转:

我们有:

1 - pi < 0 

所以我们不跳。

它只发生在条件:

x - value > 0是真的,对吧?溢出标志在 jg 中是如何工作的?

fcomp ; st0:1 , st1:pi

 fstsw ax   
 sahf 

ja nie_odejmuj ;

我们跳吗?

使用 FPU

4

1 回答 1

2

ja需要 CF==0 和 ZF==0。它不检查OF。在 x87 标志中,这意味着 C0==0 和 C3==0。FCOM使用,FCOMP等进行比较的条件正是 ST(0) > ST(1) 。

您不应该与正式的条件差异(ja比较无符号数)混淆,因为 x87 条件标志不同并且使用特殊传输在此处传递。甚至可以看到完全不匹配的条件,但英特尔试图提供至少在条件和检查指令之间非常相似的地方。

OTOH, ,是的,使用未使用+jg传递的位检查其他条件。因此,即使名称与所需条件相同,也不适用于此处。fstswsahf

这是遗留问题,以及大量其他 x86 奇怪的解决方案。(30 多年没有从头开始重新设计的开发并没有给出一致的结果。OTOH,所有这些都有很好的记录,所以你应该遵循已知的食谱。)

更新:顺便说一句,您也可以直接跳过sahf并检查标志:

fstsw ax
test ax, 4100h
jz nie_odejmuj

它在代码中更长,但更清楚地表达了方法。

于 2014-01-06T16:00:08.170 回答