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