FCOM在Turbo Assembler中不起作用

时间:2015-12-17 17:27:52

标签: assembly floating-point x86 compare

我在tasm中有比较的问题。我有一个代码

cycle:
...some code...
fninit
fld limit
fld currentX    
fcom st(1)
jge exit
jmp cycle

但即使条件不满足,它也会跳到退出标记。我在turbo调试器中检查它,并且fpu堆栈值是正确的。如何解决?

1 个答案:

答案 0 :(得分:4)

fcom仅设置fpu状态位,而不是cpu标志,因此您无法直接使用条件跳转。有fcomi指令可以执行,但只有在使用P6 + cpu和了解此类指令的汇编程序时才可以使用。根据Michael Petch的说法,至少你需要5.3版本。解决方法是使用fstsw axsahf将fpu状态位传输到cpu标志。

另请注意,在任何一种情况下,相关的fpu状态位C0C2C3都会转移到CFPF和{{1因此,您应该使用检查这些标志的条件跳转。在您的情况下,这意味着ZF

另请参阅英特尔®64和IA-32架构软件开发人员手册第1卷:基本架构中的 8.1.4条件代码上的分支和条件移动当然,指令集像往常一样参考。