汇编程序如果上面的跳转如何工作

时间:2014-01-06 15:33:47

标签: assembly

我们正在比较2个值  1和pi

然后我使用'如果超过'或者如果更大则跳跃: 我们有:  1 - pi< 0  所以我们不跳。

它仅在条件:x - 值>时出现。 0是真的吧? 以及如何在jg中使用溢出标志?

" fcomp; st0:1,st1:pi

fstsw ax
 sahf

ja nie_odejmuj;我们跳? "

使用FPU

1 个答案:

答案 0 :(得分:0)

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

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

OTOH,jg,是的,使用fstsw + sahf检查未传递的其他条件。因此,即使命名与所需条件相同,它也不适用于此。

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

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

fstsw ax
test ax, 4100h
jz nie_odejmuj

代码更长,但表达方法更清晰。