比较浮点数
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
).
的想法相同
您可能应该使用 faddp
和 fcomip
来弹出 x87 堆栈,这样您就不会让它处于不平衡状态。
在 x87 标签 wiki 中查看一些 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
我的问题是:我做错了什么?它如何修复它?谢谢!
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
).
您可能应该使用 faddp
和 fcomip
来弹出 x87 堆栈,这样您就不会让它处于不平衡状态。
在 x87 标签 wiki 中查看一些 x87 链接。