C 为什么asm代码不将指针指向的值加倍
我正在尝试将c代码与asm接口。 但它工作不正常,我无法找到问题 程序.cC 为什么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
#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
如您所见,存在两个问题:
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