为什么这个 asm 代码没有将指针指向的值加倍
Why this asm code not doubling the value the pointer points
我正在尝试将 c 代码与 asm 接口。
但是它不能正常工作,我找不到问题。
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
The output it prints is :10 whereas I am expecting: 20
代码中有什么问题?不要考虑程序的效率。我刚开始asm编程。
我在阅读 this link 中保存的一个更复杂的示例后创建了上面的代码。这非常有效。
你应该尽快学会使用调试器。它不仅可以帮助您找到错误,还可以让您准确地看到 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 , (%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
我正在尝试将 c 代码与 asm 接口。 但是它不能正常工作,我找不到问题。
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
The output it prints is :10 whereas I am expecting: 20
代码中有什么问题?不要考虑程序的效率。我刚开始asm编程。
我在阅读 this link 中保存的一个更复杂的示例后创建了上面的代码。这非常有效。
你应该尽快学会使用调试器。它不仅可以帮助您找到错误,还可以让您准确地看到 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 , (%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