我必须在asm中编写函数,并且我在C
中有原型void fdct(float *in, float *out, unsigned int n);
其中:
in
:指向传入数据缓冲区的指针out
:指向输出数据缓冲区的指针n
:数据矩阵的数量。函数不会返回任何内容,但可以使用输出数据数组,并且必须根据结果进行更改。
据我所知,在cdecl堆栈中看起来像:
esp: ret
esp+4: *in - address
esp+8: *out - address
esp+12: value of n
我知道,如何使用传入缓冲区在asm中工作,但我不知道如何返回输出缓冲区的新地址 - 只是将新地址放入esp+8
并不是结果,它不会改变*out
的值。我该如何处理这个问题?
答案 0 :(得分:4)
这不应该如何运作。
您的汇编程序功能不在float
中分配float
(或out
数组)和返回它。
相反,调用者应该分配这样一个数组(例如使用malloc()
,calloc()
- 或者他或她的语言提供的任何函数 - 或者仅仅作为局部变量在堆栈上)和传递 out
中第一个元素的地址。您的函数只是使用合适的float
值填充数组,可能最多为n
个元素。
示例:
float a[16] = ... ; /* fill it up with suitable values */
float b[16] = { 0 }; /* receives result values */
fdct(a, b, 16);