c - x87 双加法不起作用

标签 c assembly x86-64 att x87

我定义了一个汇编函数,它接受三个参数(int、double、double),该函数应该将两个放入的 double 值相加并返回此相加的结果。我不知道为什么下面的代码不起作用:

extern double ftaylor(unsigned int n, double x, double y);
int main()
{
    double z  = 14;
    z = ftaylor(30, 13.45, 7);


    printf("%f", z);
    return 0;
}

以及组装函数:

.globl ftaylor

ftaylor:
    .lcomm state, 8
    .lcomm state2, 8
    push %rbp
    mov %rsp, %rbp
    push %rax

    mov %rdi, %rax
    movsd %xmm0, state
    movsd %xmm1, state2

    finit

    fld state
    fld state2

    fadd %st(1), %st(0)

    fstp state
    fstp state2

    movsd state, %xmm0

    pop %rax
    mov %rbp, %rsp
    pop %rbp
    ret

终端上打印的结果是13.45。看起来处理器没有执行加法。我不知道为什么。

最佳答案

主要问题是没有后缀的 fld/fstp 默认为 s(hort),也称为单精度 float 。但是您有 double 值,因此您应该使用 fldl/fstpl。正如其他人指出的那样,除非绝对必要,否则不要使用 x87。另外,学习使用调试器。

关于c - x87 双加法不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30311528/

相关文章:

gcc - 如何在 NASM 中导出符号

assembly - P6 架构 - 除了寄存器重命名之外,有限的用户寄存器是否会导致更多的操作花费在溢出/加载上?

c - 在哪里可以找到使用 zlib 解压缩的示例?

c - 如何修改指向void函数内部结构的指针

python - pycparser 无法解析 gcc 可以处理的一些语法

c - 具有连接文件描述符的 pthread 竞争条件

parsing - 使用 yyparse() 制作两遍汇编程序?

c - 从.c程序获取程序集x86的地址

linux - 将 500 字节缓冲区用于简单的大写转换器有什么好处吗?

assembly - movzbl(%rdi, %rcx, 1), %ecx 在 x86-64 汇编中是什么意思?