x87 双重加法不起作用
x87 double addition don't work
我定义了一个汇编函数,它接受三个参数(int、double、double),它应该添加两个 putted double 值和 return 此添加的结果。而且我不知道为什么下面的代码不起作用:
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
。看起来处理器没有执行加法。不知道为什么。
state
,由 x87 代码片段计算,被 xmm0 中存储的值覆盖:
...
movsd %xmm0, state
...
... x87 calculation of state ...
...
movsd state, %xmm0
...
经过反复讨论,似乎 AT&T 语法 可以 使用相反的参数顺序,即 mov a, b
移动 from b to a,这将解释输入参数的覆盖,以及 OP 观察到的输出。不过,他的汇编程序使用的确切语法仍然不清楚,所以我对这个答案有点犹豫。
其他可能的原因已在其他回答和评论中指出。
主要问题是没有后缀的 fld/fstp
默认为 s(hort)
,也就是众所周知的单精度浮点数。但是你有双精度值,所以你应该使用 fldl/fstpl
。正如其他人指出的那样,除非绝对必要,否则不要使用 x87。另外,学习使用调试器。
我定义了一个汇编函数,它接受三个参数(int、double、double),它应该添加两个 putted double 值和 return 此添加的结果。而且我不知道为什么下面的代码不起作用:
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
。看起来处理器没有执行加法。不知道为什么。
state
,由 x87 代码片段计算,被 xmm0 中存储的值覆盖:
...
movsd %xmm0, state
...
... x87 calculation of state ...
...
movsd state, %xmm0
...
经过反复讨论,似乎 AT&T 语法 可以 使用相反的参数顺序,即 mov a, b
移动 from b to a,这将解释输入参数的覆盖,以及 OP 观察到的输出。不过,他的汇编程序使用的确切语法仍然不清楚,所以我对这个答案有点犹豫。
其他可能的原因已在其他回答和评论中指出。
主要问题是没有后缀的 fld/fstp
默认为 s(hort)
,也就是众所周知的单精度浮点数。但是你有双精度值,所以你应该使用 fldl/fstpl
。正如其他人指出的那样,除非绝对必要,否则不要使用 x87。另外,学习使用调试器。