gpt4 book ai didi

c - 为什么这个 asm 代码没有将指针指向的值加倍

转载 作者:行者123 更新时间:2023-12-04 19:30:29 24 4
gpt4 key购买 nike

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

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

代码.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

如您所见,存在两个问题:

  1. 您将指针加倍,而不是它指向的值
  2. 您不会将其写回内存,只是将其返回到 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

关于c - 为什么这个 asm 代码没有将指针指向的值加倍,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30130505/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com