【问题标题】:How to get pointer to outcoming buffer using asm?如何使用 asm 获取指向输出缓冲区的指针?
【发布时间】:2017-01-02 20:09:32
【问题描述】:

我必须在 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。我该如何解决这个问题?

【问题讨论】:

  • 您使用的是什么操作系统?与 Windows 相比,*nix 上的 cdecl 调用约定略有不同。
  • Windows,我忘了这个。

标签: c x86 nasm cdecl


【解决方案1】:

这不是应该的工作方式。

你的汇编函数没有分配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); 

【讨论】:

  • 如果您确实希望函数分配内存,则需要将out 参数更改为指向指针的指针。但我同意你提出的设计更可取,因为它使所有权更容易推理。
  • 非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-13
  • 2015-04-15
  • 2013-07-26
  • 2011-02-17
  • 1970-01-01
  • 2019-06-19
相关资源
最近更新 更多