我几天前问了一个类似的问题,当时非常不精确,所以这里有一个更详细的帖子。所以我目前正在使用NASM编写x86 32位程序集,我想在c ++程序中使用我的自定义函数。我在使用返回值时遇到了问题。
以下是我在汇编中的示例代码:
section .data
value: dq 1.0
section .text
global _arsinh
_arsinh:
fld dword[esi-8] ;loads the given value into st0
ret
以下是我在c ++中的示例/测试代码:
#include <iostream>
extern "C" float arsinh(float);
int main()
{
float test = arsinh(5.0);
printf("%f\n", test); //Displays -96715160...
printf("%f\n", arsinh(5.0)); //Displays -96715160...
std::cout << test << std::endl; //Displays -9.671512e+24
std::cout << arsinh(5.0) << std::endl; //Displays 5
}
所有汇编代码都是从堆栈加载给定值(在本例中为5.0)并将其存储在st0中。我现在遇到的问题是,除了最后一个打印语句之外的所有语句都显示错误的值(不是5.0)。我假设问题是我正在加载dword而不是qword,因为以下代码可以正常运行(显示正确的值):
section .data
value: dq 1.0
section .text
global _arsinh
_arsinh:
fld qword[value] ;loads value into st0
ret
我想将返回的值保存到float中,然后用它在c ++ / c中做一些额外的计算,但我似乎无法弄清楚如何做到这一点,因为我别无选择,只能将给定值作为双字加载。