【发布时间】:2019-08-07 17:37:14
【问题描述】:
当我调用该函数时,它返回 0.0000,而它应该返回 25.0000
我曾尝试寻找类似的问题,但找不到。我试过翻阅英特尔的手册,但到目前为止没有任何效果。
我通过c++调用函数
double t=floatingPointTest(5);
printf("%f\n",t);
asm 函数:
floatingPointTest:
push rbx
push rbp
mov rbp,rsp
cvtsi2sd xmm0,rdi
cvtsi2sd xmm1,rdi
mulsd xmm0,xmm1
mov rsp,rbp
pop rbp
pop rbx
ret
即使 rdi 为 5,我也得到 0.0000
【问题讨论】:
-
在调试器中单步执行?
-
确实,似乎 cvtss2sd xmm0,xmm0 就在通话之后。知道为什么吗?
-
C 代码中
floatingPointTest的原型是什么? -
这里有两种可能。您已将
floatingPointTest的原型定义为返回float而不是double和/或floatingPointTest的第一个参数是错误的。您的汇编代码建议您的函数采用 Clong(64 位 GCC 中的四字)并返回双精度。正确的原型是extern double floatingPointTest(long val); -
如果答案解决了您的问题,请考虑通过接受答案将其标记为已解决。可以在这里找到这样做的方法和原因:meta.stackexchange.com/a/5235/271768
标签: c++ linux assembly floating-point x86-64