我正在编写一个小型汇编程序,它接受两个单精度浮点数,将它们相加并显示结果。但是,我希望将结果保存在寄存器中供以后使用。为了帮助我开始,我已经将c ++程序编译成汇编程序,并尝试编辑它。但是,我不明白我得到的结果,其中包括:
movl $0x49742408, %eax
movl %eax, 20(%esp)
movl $0x49f42405, %eax
movl %eax, 24(%esp)
flds 20(%esp)
fadds 24(%esp)
fstps 28(%esp)
flds 28(%esp)
fstpl 4(%esp)
movl $.LC2, (%esp)
call printf
movl $0, %eax
首先,我在考虑浮点数时是否正确,s
表示32位而l
表示64位?其次,为什么它会将一个32位浮点值弹出到28(%esp)
,只是将它存回数据寄存器堆栈?删除这两行导致结果不太精确,这很奇怪。最后,它再次弹出数据寄存器堆栈,但这次是64位值。我想要一个单精度32位值。但是,将l
更改为s
会导致我获得0.是否有人知道到底发生了什么?
答案 0 :(得分:0)
s
是32位(float
),l
是64位(double
)。fstpl 4(%esp)
。我假设您正在查看未经优化的代码。printf
期望参数符合C调用约定,因此varargs会自动提升为double
。