【问题标题】:Passing array to external assembly function将数组传递给外部汇编函数
【发布时间】:2011-01-13 08:30:11
【问题描述】:

不知何故与此calling assembly functions from c相关

我正在向该函数传递一个整数数组和一个长度:

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));

然后它就被数据填满了。

【问题讨论】:

  • 您确定array 包含有效的以'\0' 结尾的ASCII 字符串吗?
  • array 被定义为 int *array;数组 = malloc ....;对于数组
  • 需要问的愚蠢问题:您正在检查malloc 没有失败,对吧?
  • 如何打印值? *(int *)($ebp + 8) 是指向第一个元素的指针,因此(在 GDB 中)x/10x *(int *)($ebp + 8) 应该打印数组中的前 10 个值。
  • @diciu 我正在尝试将 %edx 放入堆栈并使用对 printf 的调用。 %edx 是 (%eax,%edi,4) 并且 %eax 应该是数组的地址。

标签: c assembly x86 gnu-assembler


【解决方案1】:

您应该已经发布了完整的代码。作为说明,我写了this sample program。请注意,它只是内联 asm,以便 ideone 可以从单个文件编译它。如您所见,您发布的代码在正确使用时确实有效。所以问题一定出在你忽略的其他部分。

【讨论】:

  • 它适用于以下注释行,即打印数组中的第一个值,但如果我启用循环 ideone.com/XyrPx asm 文件和 C 文件 ideone.com/mzFD1 则失败
  • @void:正如我对您的其他问题的评论,被调用的函数可以更改 eax、ecx 和 edx。所以, printf 调用会破坏 eax(实际上包含返回值),你将不得不重新加载它。
  • 我对 edi 和 ecx 非常关心,以至于我忘记了 eax,我是个白痴。谢谢
猜你喜欢
  • 2020-02-14
  • 2013-01-13
  • 2011-07-08
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
  • 2021-09-21
  • 1970-01-01
  • 2018-04-28
相关资源
最近更新 更多