assembly 使用MASM将十进制值赋给REAL8局部变量

wlzqhblo  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(117)

我试图将一个十进制值赋给一个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中,有没有更好的方法来处理十进制数?
也许其他汇编程序处理浮动更好?

ktecyv1j

ktecyv1j1#

我试图将一个十进制值赋给一个REAL8局部变量,然而,我发现的唯一古怪的方法是将十进制数转换为IEEE 754 64位数。

MOV             RAX,4609434218613702656
MOV             stop,RAX
FLD             QWORD PTR stop

您已经在mov rax指令中硬编码了十进制数1.5。为此,您必须自己转换该数字。
使用REAL8指令时,您可以更轻松地完成转换,而不必考虑转换:

...
        db      48h, 0B8h       ; REX prefix, MOV RAX opcode
        REAL8   1.5             ; 64-bit immediate
        mov     stop, rax       ; Loading the local variable
        fld     QWORD PTR stop  ; Loading st0
        ...

或者,将(硬编码的)数字放在程序中任何你喜欢的地方,然后从那里开始fld

ALIGN   8
start   REAL8   1.1
num     REAL8   1.5
        ...
        fld     QWORD PTR num
        ...

...
        fld     QWORD PTR num
        ...
        ret
        ALIGN   8
num     REAL8   1.5
main    endp

相关问题