在x87 FPU中简单添加单精度浮子

时间:2013-11-29 14:25:26

标签: assembly x86 fpu x87

我正在编写一个小型汇编程序,它接受两个单精度浮点数,将它们相加并显示结果。但是,我希望将结果保存在寄存器中供以后使用。为了帮助我开始,我已经将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.是否有人知道到底发生了什么?

1 个答案:

答案 0 :(得分:0)

  1. 是的,s是32位(float),l是64位(double)。
  2. 您当然不能删除它,然后您必须使用fstpl 4(%esp)。我假设您正在查看未经优化的代码。
  3. printf期望参数符合C调用约定,因此varargs会自动提升为double