Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.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_Assembly_X86_Att - Fatal编程技术网

C 为什么asm代码不将指针指向的值加倍

C 为什么asm代码不将指针指向的值加倍,c,assembly,x86,att,C,Assembly,X86,Att,我正在尝试将c代码与asm接口。 但它工作不正常,我无法找到问题 程序.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; } 我正在创建最终的可执行文件 as code.asm -o code.o gcc program.c code.o -o output

我正在尝试将c代码与asm接口。 但它工作不正常,我无法找到问题

程序.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;
}
我正在创建最终的可执行文件

as code.asm -o code.o
gcc program.c code.o -o  output
./output
它打印的输出是:10,而我预期是:20

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


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

您应该尽快学会使用调试器。它不仅可以帮助您找到bug,还可以让您准确地看到cpu在每条指令中执行的操作,并可以将其与您的意图进行比较

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

让我们评论一下您的代码:

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
如您所见,存在两个问题:

  • 您正在加倍指针,而不是指针指向的值
  • 您没有将它写回内存,只是在eax中返回它,然后被C代码忽略
  • 一个可能的解决方案:

    asm_multi:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%eax       # fetch p
        shll $1, (%eax)         # double *p by shifting 1 bit to the left
    # alternatively
    #   movl (%eax), %edx       # fetch *p
    #   addl %edx, (%eax)       # add *p to *p, doubling it
        movl %ebp,%esp
        popl %ebp
        ret
    

    与此无关的是,如果您刚刚开始asm编程并了解C,那么在各种优化方式(包括无优化)下打开asm生成(
    -S
    )的情况下,花费大量时间在通过C编译器发送的简单函数上会非常有用,我强烈建议您这样做。此函数将是该技术的最佳候选函数。@WhozCraig:这非常有用:)
    asm_multi:
        pushl %ebp
        movl %esp,%ebp
        movl 8(%ebp),%eax       # fetch p
        shll $1, (%eax)         # double *p by shifting 1 bit to the left
    # alternatively
    #   movl (%eax), %edx       # fetch *p
    #   addl %edx, (%eax)       # add *p to *p, doubling it
        movl %ebp,%esp
        popl %ebp
        ret