MASM x64 组装 printf 浮动

问题描述 投票:0回答:1
.data
temp real4 ?
fmtStr byte 'Result is: %d', 10, 0
fmtStr2 byte 'Result is: %f', 10, 0
i real4 ?

.code
printFloat proc
    sub rsp, 20h
    movsd xmm1, [temp]
    lea rcx, fmtStr2 
    call printf
    add rsp, 20h;
    ret
printFloat endp

结果始终为 0.0000000。我如何获得像 5.3434 这样的 real4 值

assembly printf masm masm32 masm64
1个回答
0
投票

这里有一些错误。

temp
是一个
real4
,但它应该是一个
real8
,或者它可以保留一个
real4
,但我们需要将其转换为双精度型以将其传递给
printf
(可变参数函数不接受浮动,它们必须是双的)。

浮点参数也必须复制到相应的整数参数中,因此在这种情况下

rdx

此外,从

20h
中减去
rsp
是错误的,它会使堆栈未对齐,而
printf
可能不喜欢这样(它在我的系统上不喜欢这样)。如果你在这里有这个,你也可能在其他函数中也有它,并且某些组合无论如何都会意外地导致正确的对齐,但出于错误的原因。

您显示的代码从未将非零分配给

temp
,但我假设您在其他地方这样做了。

这段代码对我有用:

.data
temp real8 5.4321
fmtStr2 byte 'Result is: %f', 10, 0

.code

extrn printf : proc

printFloat proc
    sub rsp, 28h
    movsd xmm1, [temp]
    mov rdx, [temp]
    lea rcx, fmtStr2 
    call printf
    add rsp, 28h
    ret
printFloat endp

end
© www.soinside.com 2019 - 2024. All rights reserved.