【问题标题】:Simple addition of single precision floats in x87 FPU在 x87 FPU 中简单添加单精度浮点数
【发布时间】:2013-12-15 18:39:29
【问题描述】:

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

【问题讨论】:

    标签: assembly x86 fpu x87


    【解决方案1】:
    1. 是的,s 是 32 位 (float),l 是 64 位 (double)。
    2. 当然不能只删除它,然后必须使用fstpl 4(%esp)。我假设您正在查看未优化的代码。
    3. printf 需要根据 C 调用约定的参数,因此可变参数会自动提升为 double

    【讨论】:

    • 2.是的,它未优化。那么它为什么这样做呢? 3. 怎么改成浮点数?
    • 正如我所说,printf 仅根据 C 标准处理双精度数。您可以将其更改为浮点数,但不能使用printf
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2020-02-03
    • 2015-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-06
    相关资源
    最近更新 更多