我正在开展执行算术运算的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
我的问题是:我做错了什么?怎么解决呢?谢谢!
答案 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
相同的想法。
你可能应该使用faddp
和fcomip
同时弹出x87堆栈,这样你就不会让它失去平衡。
查看x87代码wiki中的一些x87链接。