如何使用asm获取指向输出缓冲区的指针?

时间:2017-01-02 20:09:32

标签: c x86 nasm cdecl

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

1 个答案:

答案 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);