Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用asm获取指向输出缓冲区的指针?_C_X86_Nasm_Cdecl - Fatal编程技术网

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

C 如何使用asm获取指向输出缓冲区的指针?,c,x86,nasm,cdecl,C,X86,Nasm,Cdecl,我必须用asm编写函数,我有C语言的原型 void fdct(float *in, float *out, unsigned int n); 其中: 中的:指向传入数据缓冲区的指针 out:指向输出数据缓冲区的指针 n:数据矩阵的数量 函数不返回任何内容,但处理输出数据的数组,并且必须根据结果对其进行更改 据我所知,cdecl中的堆栈将如下所示: esp: ret esp+4: *in - address esp+8: *out - address esp+12: value of n

我必须用asm编写函数,我有C语言的原型

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

  • 中的
    :指向传入数据缓冲区的指针
  • out
    :指向输出数据缓冲区的指针
  • n
    :数据矩阵的数量
函数不返回任何内容,但处理输出数据的数组,并且必须根据结果对其进行更改

据我所知,cdecl中的堆栈将如下所示:

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

我知道了,如何在asm中使用传入缓冲区,但我不知道如何返回传出缓冲区的新地址-只是将新地址放入
esp+8
中不是结果,它不会改变
*out
的值。我如何处理这个问题?

这不是应该如何工作的

您的汇编器函数不会分配一个
float
(或一个
float
数组)并将其返回
out

相反,调用方应该分配这样一个数组(例如,使用
malloc()
calloc()
——或者他或她的语言提供的任何函数——或者仅仅作为堆栈上的局部变量),并将
中的第一个元素的地址传递出去。您的函数只是用合适的
float
值填充数组,可能多达
n
元素

例如:

float a[16] = ... ;  /* fill it up with suitable values */
float b[16] = { 0 }; /* receives result values */

fdct(a, b, 16); 

这不是应该如何工作的

您的汇编器函数不会分配一个
float
(或一个
float
数组)并将其返回
out

相反,调用方应该分配这样一个数组(例如,使用
malloc()
calloc()
——或者他或她的语言提供的任何函数——或者仅仅作为堆栈上的局部变量),并将
中的第一个元素的地址传递出去。您的函数只是用合适的
float
值填充数组,可能多达
n
元素

例如:

float a[16] = ... ;  /* fill it up with suitable values */
float b[16] = { 0 }; /* receives result values */

fdct(a, b, 16); 

您使用的是什么操作系统?与Windows相比,
cdecl
在*nix上的调用约定略有不同。Windows,我忘了注意这一点。您使用的是什么操作系统?与Windows相比,
cdecl
在*nix上的调用约定有细微的不同。Windows,我忘了注意这一点。如果确实希望函数分配内存,则需要将
out
参数更改为指针对指针。但我同意你建议的设计更可取,因为它使所有权更容易推理。非常感谢你的帮助!如果确实希望函数分配内存,则需要将
out
参数更改为指针对指针。但我同意你建议的设计更可取,因为它使所有权更容易推理。非常感谢你的帮助!