比较浮动总和

时间:2017-11-02 04:01:01

标签: assembly masm masm32 x87

我正在开展执行算术运算的MASM32项目。我们必须使用协处理器(8087指令集)来使用浮点单元。因此,我的浮点限制是100.0,那么每个数字必须小于限制。我试图将两个数字相加,然后比较结果,但它不起作用。

.386
.model flat, stdcall
option casemap :none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib
include c:\masm32\include\masm32rt.inc
.data
    ;Variables de comparación.
    FP_max DD 100
    ;Variables volcadas de la tabla de símbolos.
    _a DD 25
    _b DD 80.0
.code
    start:
         fild _a
         fild _b
         fadd
         fcom FP_max       ;compare ST(0) with the value of the real8_var variable
         fstsw ax          ;copy the Status Word containing the result to AX
         sahf              ;transfer the condition codes to the CPU's flag register
         ja overflow       ;when all flags are 0

        jmp end_program

        overflow:
            print "ERROR: overflow.", 13, 10, 0
            jmp end_program
        end_program:
            invoke ExitProcess, 0
    end start

我的问题是:我做错了什么?怎么解决呢?谢谢!

1 个答案:

答案 0 :(得分:1)

fild是整数 - > FP负载。 fld是浮动负载。 (你的汇编器通过查看标签后面的第一个指令,神奇地推断你需要32位负载。同一条指令可以加载64位整数或FP。)

dd根据表达式中是否有小数点,为数字选择整数或浮点编码。 (MASM可能还有其他强制FP解释的方法,比如REAL4。(Float data example using Masm

您使用fild _b,但_b包含32位二进制浮点值。将该位模式视为32位整数可能不是您想要做的。

使用_b DD 80代替_b DD 80.0,或使用fld _b代替fild _b

FP_max DD 100存在相反的问题,因为您使用fcom从内存加载它。设为REAL4

(或者使用ficom,但请注意,没有ficomi指令可以与整数进行比较并直接设置标记。那里有fcomi(你是应该使用)比较浮点数,并且ficom类似于fild + fcomp,但不需要额外的FP寄存器。与fiadd相同的想法。

你可能应该使用faddpfcomip同时弹出x87堆栈,这样你就不会让它失去平衡。

查看代码wiki中的一些x87链接。