我正在混合C和汇编,并将其发送到汇编:
extern int Fill(int** arr, int n);
如何动态分配大小为n的数组(应该在后面的**arr中),并用数字1填充数组。(小型,.386)
如果分配失败,则返回0。否则,它只需将其分配并粘贴到[bp+4],然后用数字1填充。
您没有提到您使用的操作系统或编译器。
对于386,小型和扁平型应该相同。如果这是一个选项,您可能希望使用.model small,c或.model flat,c,这样您就不必在名称前加上_,这取决于编译器和汇编程序。
假设使用帧指针的标准调用约定(ebp被推到堆栈上):
mov eax,12[ebp] ;n
push eax
call malloc ;or maybe _malloc
add esp,4
如果使用fastcall,则前两个参数在寄存器中。哪些寄存器取决于操作系统/编译器。
如果遇到问题,请用C或C++编写代码,然后让编译器输出汇编代码,以便查看名称和函数的调用方式。
"malloc a stack array"?堆栈分配是malloc的相反类型的分配。它很快,但当函数返回时就释放了。
如果需要分配将返回给调用者的内存,则需要使用malloc(即对malloc
库函数进行函数调用)。
或者,如果传递指针的代码不指向free(3)
,则可以直接使用mmap(MAP_ANONYMOUS)
。
使用rep stosd
填充它以存储32位(双字)整数。(或者,如果您关心具有慢速rep stosd
(AMD预推土机)的旧CPU的性能,请使用SSE矢量存储。)有关许多有用的链接,请参阅x86 wiki。