1

我必须在 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. 我该如何处理这个问题?

4

1 回答 1

4

这不是应该如何工作的。

您的汇编程序函数不会分配a 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); 
于 2017-01-02T20:29:11.543 回答