2017-01-02 57 views
1

我必须写在asm函数,以及i在C原型如何使用asm获取指向输出缓冲区的指针?

void fdct(float *in, float *out, unsigned int n); 

其中:

  • in:指针输入数据缓冲器
  • out:指针outcoming数据缓冲器
  • n:数据矩阵的数量。

函数不会返回任何内容,但会与输出数据的数组一起使用,并且必须根据结果进行更改。

据我了解,在CDECL栈看起来像:

esp: ret 
esp+4: *in - address 
esp+8: *out - address 
esp+12: value of n 

我,怎么能和进入缓冲ASM工作,但我不明白如何outcoming缓冲区返回新地址 - 只是将新地址放入esp+8不是结果,它不会更改*out的值。我怎样才能解决这个问题?

+0

什么操作系统您使用的?与Windows相比,cdecl调用约定在* nix上略有不同。 –

+0

窗户,我忘了注意这一点。 –

回答

4

这不是这应该如何工作。

你的汇编函数确实out分配float(或float阵列)和返回它。

相反,呼叫者应该分配这样的阵列(例如,使用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); 
+0

如果您希望函数分配内存,您需要将'out'参数更改为指针指针。但我同意你提出的设计是可取的,因为它让所有权更容易推理。 –

+0

非常感谢您的帮助! –

相关问题