assembly MASM x64汇编printf float

osh3o9ms  于 11个月前  发布在  其他
关注(0)|答案(1)|浏览(124)
.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值

oxalkeyp

oxalkeyp1#

这里有些虫子。
temp是一个real4,但它应该是一个real8,或者它可以保持一个real4,但我们需要将它转换为一个double传递给printf(varargs函数不接受浮点数,它们必须是double)。
浮点参数也必须复制到相应的整数参数中,因此在本例中为rdx
另外,从rsp中减去20h是错误的,它会使堆栈不对齐,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

字符串

相关问题