-3

我定义了一个汇编函数,它接受三个参数(int、double、double),它应该添加两个 putted 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。看起来处理器不执行加法。我不知道为什么。

4

2 回答 2

2

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

于 2015-05-18T20:46:45.243 回答
1

state,由 x87 代码片段计算,被存储在 xmm0 中的值覆盖:

...
movsd %xmm0, state
...
... x87 calculation of state ...
...
movsd state, %xmm0
...

经过一番反复,似乎 AT&T 语法可能使用颠倒的参数顺序,即bmov a, b移动a,这将解释输入参数的覆盖以及 OP 观察到的输出。不过,他的汇编器使用的究竟是什么语法仍不清楚,所以我对这个答案有点试探。

其他答案和评论中指出了其他可能的原因。

于 2015-05-18T20:26:22.580 回答