C 将数组传递给外部汇编函数
与此有关 我将向该函数传递一个int数组和一个长度:C 将数组传递给外部汇编函数,c,assembly,x86,gnu-assembler,C,Assembly,X86,Gnu Assembler,与此有关 我将向该函数传递一个int数组和一个长度: do_stuff_in_asm (array, len); 装配零件看起来像这样 ................... movl 8(%ebp), %eax movl 12(%ebp), %ecx movl $0, %edi ................... movl (%eax,%edi,4), %edx pushl %edx pushl $printtext call printf addl $8, $esp .........
do_stuff_in_asm (array, len);
装配零件看起来像这样
...................
movl 8(%ebp), %eax
movl 12(%ebp), %ecx
movl $0, %edi
...................
movl (%eax,%edi,4), %edx
pushl %edx
pushl $printtext
call printf
addl $8, $esp
..................
我可以打印len参数12(%ebp),但每次我在%edx上尝试相同的操作时(它应该是数组的第一个元素),我都会遇到分段错误
int *array, n, i;
printf ("Give array size: ");
scanf("%d",&n);
array = malloc (n * sizeof(int));
然后它被数据填满。你应该发布完整的代码。作为说明,我已经写了。注意,它只是内联asm,以便ideone可以从单个文件编译它。正如您所看到的,如果使用得当,您发布的代码确实有效。因此,问题一定是在您忽略的其他部分。您确定
数组
包含有效的以“\0”结尾的ASCII字符串吗?数组定义为int*array;数组=malloc。。。。;对于需要询问的arrayStupid问题:您正在检查malloc
是否没有失败,对吗?如何打印值*(int*)($ebp+8)是指向第一个元素的指针,因此(在GDB中)x/10x*(int*)($ebp+8)应该打印数组中的前10个值。@diciu我正在尝试将%edx放在堆栈上,并使用对printf的调用。%edx是(%eax,%edi,4),并且%eax应该是数组的地址。它与以下注释的行一起工作,即打印数组中的第一个值,但如果启用循环asm文件和C文件@void,则会失败:正如我在另一个问题上所评论的,允许调用函数更改eax、ecx和edx。因此,printf调用将破坏eax(事实上,它包含返回值),您必须重新加载它。我对edi和ecx照顾得太多了,以至于我忘记了eax,我是个白痴。谢谢