0

我正在编写一个小型汇编程序,它采用两个单精度浮点数,将它们相加并显示结果。但是,我希望将结果保存在寄存器中以备后用。为了帮助我开始,我将一个 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 位和64 位,我是否正确l?其次,为什么将 32 位浮点值弹出到28(%esp)中,只是为了将其存储回数据寄存器堆栈中?删除这两行会导致结果不太精确,这很奇怪。最后,它再次弹出数据寄存器堆栈,但这次是 64 位值。我想要一个单精度 32 位值。但是,更改ls导致我得到 0。有人知道到底发生了什么吗?

4

1 回答 1

0
  1. 是的,s是 32 位 ( float),l是 64 位 ( double)。
  2. 您当然不能只删除它,然后您必须使用fstpl 4(%esp). 我假设您正在查看未优化的代码。
  3. printf根据 C 调用约定需要参数,因此 varargs 会自动提升为double.
于 2013-11-29T14:49:03.287 回答