比较指令不正常

时间:2015-11-17 11:02:03

标签: assembly floating-point x86 masm32

我将从用户收到的一些输入与一些数字进行比较,无论比较如何,都会进行相同的跳转。

用户输入定义如下:

.data?
    userInput REAL4 ?

当我比较它时,我使用:

cmp userInput, 18200
jge _tb0    ;This jump is always taken

但是我测试userInput小于,等于,大于18200,但它仍会跳转到相同的标签。

我刚开始从this教程开始学习汇编,到目前为止教学效果很好,但是没有太多信息,我在网上找到一个好的,详细的教程,以便我可以学习我做错了什么。

更新

在阅读了一些关于使用FPU进行浮点数学运算之后,我想出了以下变量代码:

.data?
    userInput real4 ?

.const
    tb0_max real4 18200.00

和以下用于比较的代码:

fld userInput
fcom tb0_max
jge _tb0

然而,我仍然得到与以前相同的结果,无论作为用户输入给出的值,我都跳转到_tb0

更新2:

在与FPU进行比较后阅读this后,我发现以下代码应该,根据文章,允许我将比较状态从FPU移到CPU这样我就可以使用常规的CPU比较指令:

fld userInput
fcom tb0_max
fstsw ax
fwait
sahf
jge _tb0

但是我仍然遇到同样的问题,因为userInput小于常量18200.00而不管userInput

,所以compare总是会产生结果

2 个答案:

答案 0 :(得分:2)

cmp本身正常运作。但是你没有正确使用它。 REAL4是浮点类型。 cmp仅适用于整数操作数。要么使用整数,要么学习如何比较浮点值。

答案 1 :(得分:1)

由于您想要将单个精确浮点数( userInput )与整数( 18200 )进行比较,您可以暂时将其作为整数存储,然后执行比较:

.data?
userInput   REAL4 ?
tempInteger dd ?

...

fld   userInput
fistp tempInteger
cmp   tempInteger, 18200
jge   _tb0