比较浮点数

Compare float sum

我正在处理一个执行算术运算的 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

我的问题是:我做错了什么?它如何修复它?谢谢!

fild is an integer->FP load. 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 链接。