为什么这个asm代码不会使指针指向的值加倍

时间:2015-05-08 18:26:08

标签: c assembly x86 att

我正在尝试使用asm连接c代码。 但它无法正常工作,我无法找到问题。

program.c

#include<stdio.h>
int *asm_multi(int *ptr);

int main()
{
  int i=10;
  int *p=&i;
  asm_multi(p);
  printf("%d\n",*p);
  return 0;
}

code.asm

.section .text
.global asm_multi
.type asm_multi,@function
asm_multi:
    pushl %ebp
    movl %esp,%ebp
    movl 8(%ebp),%eax
    movl %eax,%edx
    leal (%edx,%edx,1),%edx
    movl %edx,%eax
    movl %ebp,%esp
    popl %ebp
    ret

我正在通过

创建最终的可执行文件
as code.asm -o code.o
gcc program.c code.o -o  output
./output
  

它打印的输出是:10,而我期待:20

代码中有什么问题?不要考虑程序的效率。我刚刚开始编程。

在阅读保存在this link的更复杂的示例后,我创建了上面的代码。这非常有效。

1 个答案:

答案 0 :(得分:4)

您应该学会尽快使用调试器。它不仅可以帮助您找到错误,而且还可以让您准确地看到每个指令的cpu正在做什么,您可以将其与您的意图进行比较。

另外,请注释您的代码,特别是在寻求帮助时,如果您自己无法这样做,我们可以告诉您说明与您的意图不符的地方。

让我们评论您的代码:

00000000-0000-0000-0000-000000000000
    ae90c3e3-c801-4bc8-bc34-9bccfc2b692a
    ae90c3e3-c801-4bc8-bc34-9bccfc2b692a
    ae90c3e3-c801-4bc8-bc34-9bccfc2b692a
00000000-0000-0000-0000-000000000000

如您所见,有两个问题:

  1. 您将指针加倍,而不是指向
  2. 的值
  3. 你没有把它写回内存,只是在eax中返回它然后被C代码忽略
  4. 可能的解决办法:

    asm_multi:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%eax        # fetch first argument, that is p into eax
        movl %eax,%edx           # edx = p too
        leal (%edx,%edx,1),%edx  # edx = eax + edx = 2 * p
        movl %edx,%eax           # eax = edx = 2 * p
        movl %ebp,%esp
        popl %ebp
        ret
    
相关问题