如何在 Linux asm 中正确返回双精度值
How to properly return a double in linux asm
当我调用函数时,它返回 0.0000,而它应该返回 25.0000
我尝试寻找类似的问题,但我找不到。我尝试查看英特尔的手册,但到目前为止没有任何效果。
我通过 c++ 调用函数
double t=floatingPointTest(5);
printf("%fn",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 是 0.0000,我也得到 5
您没有向我们展示关键信息 - 您使用的函数floatingPointTest
的C++原型是什么。有几件事可能会导致这种行为。
-
您声明
floatingPointTest
将float
或double
作为函数的第一个参数,而它应该是整数。程序集代码使用以下指令:cvtsi2sd xmm0,rdi
我们可以推断第一个参数(在RDI中(应该是有符号
long
因为您使用RDI作为源操作数,并且具有 64 位寄存器的cvtsi2sd
会将有符号四字整数从 64 位寄存器转换为目标 XMM 寄存器中的双精度浮点值。 -
您的原型被声明为返回类型为
float
而不是double
。由于您的汇编代码仅执行数学运算,因为标量双精度,因此您需要从函数返回一个double
。
C++的正确原型可以写成:
extern "C" double floatingPointTest(long val);
观察
您的代码不使用RBX,因此无需保存/还原它。您实际上不需要堆栈帧,您可以通过将相同的寄存器作为源和目标传递给mulsd
来单独乘以数字。这段代码将执行相同的操作:
floatingPointTest:
cvtsi2sd xmm0, rdi
mulsd xmm0, xmm0
ret
相关文章:
- 特征::矩阵<双精度,1,3> 结构类型函数中的返回类型函数
- C 字符串返回字符串的整数/双精度/长整型值
- C++:strod() 和 atof() 没有按预期返回双精度
- f 是指向函数的指针,该函数采用 int,并返回指向不带任何内容并返回双精度的函数的指针
- 从 C++ 中的函数返回双精度的问题
- atof() 返回浮点数而不是双精度
- 我想读取文本文件中的所有内容(但文本文件中只有一个双精度值),转换为双精度值并返回值
- 如何在 Linux asm 中正确返回双精度值
- 如何调用返回双精度或字符串并将其保存在地图上但作为对象的类的方法
- 编译C++代码以.EXE返回双精度
- 视觉对象 返回 C++ 中的双精度值
- 为什么 boost::geometry::d istance 使用 model::d 2::p oint_xy<float> 返回双精度而不是浮点数?
- 从模板函数返回双精度或复数<double>
- C++ 从矩阵返回双精度**
- C++,函数不返回双精度
- PInvoke:返回双精度数组的问题
- 如何调用从Python返回双精度向量的c++函数
- 如何在c++中从pthread返回双精度值
- 函数返回双精度当预期的长
- 为什么从浮点返回方法返回双精度不会在 c++ 中导致任何错误/警告