我试图将一个十进制值赋给一个REAL8局部变量,然而,我发现的唯一古怪的方法是将十进制数转换为IEEE 754 64位数。
例如,下面是一个浮点MASM 64位示例,它将值1.5赋给局部变量 stop,然后减去全局 start 时间1.1,得到正确的结果0.4:
浮点数.asm
option casemap:none
externdef printf : near
.data
szStop db "stop: %lf",0
ALIGN 8
start REAL8 1.1
.code
main proc
LOCAL stop:REAL8
; Convert decimal number to IEEE 754 64 bit number:
; https://www.ultimatesolver.com/en/ieee-754
;
; 1.5 -> 0011111111111000000000000000000000000000000000000000000000000000 -> 4609434218613702656
MOV RAX,4609434218613702656
MOV stop,RAX
FLD QWORD PTR stop
FSUB QWORD PTR start
FSTP QWORD PTR stop
PUSH RSP
PUSH QWORD PTR [RSP]
AND SPL,0F0h
MOV RDX,stop
LEA RCX,szStop
SUB RSP,32
CALL printf
LEA RSP,[RSP+40]
POP RSP
ret
main endp
end
使用这些批处理命令进行汇编:
浮点数.bat
@echo on
if not defined DevEnvDir (
call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
)
ml64.exe float.asm /link /subsystem:console /defaultlib:kernel32.lib /defaultlib:user32.lib /defaultlib:libcmt.lib
输出正确:
问题
在MASM中,有没有更好的方法来处理十进制数?
也许其他汇编程序处理浮动更好?
1条答案
按热度按时间ktecyv1j1#
我试图将一个十进制值赋给一个REAL8局部变量,然而,我发现的唯一古怪的方法是将十进制数转换为IEEE 754 64位数。
您已经在
mov rax
指令中硬编码了十进制数1.5。为此,您必须自己转换该数字。使用
REAL8
指令时,您可以更轻松地完成转换,而不必考虑转换:或者,将(硬编码的)数字放在程序中任何你喜欢的地方,然后从那里开始
fld
:或