我读了《计算机系统程序员的观点》教科书。它给出了一个示例程序:

/* read input line and write it back */
void echo(){
  char buf[8]; /* way too small !*/
  gets(buf);
  puts(buf);
}


汇编代码是:

1  echo:
2   pushl %ebp
3   movl  %esp, %ebp
4   pushl %ebx
5   subl  $20, %esp
6   leal  -12(%ebp), %ebx
7   movl  %ebx, (%esp)
8   call  gets
9   movl  %ebx, (%esp)        // This does not look useful for me
10  call  puts
11  addl  $20, %esp
12  popl  %ebx
13  popl  %ebp
14  ret


第9行在这里似乎没用,因为第7行已经将buf存储在堆栈的顶部。然后它调用获取。返回时,buf将位于堆栈的顶部。

我的问题是:
第9行在这里没有用吗?

编辑:这是Linux。

最佳答案

我的问题是:第9行在这里没有用吗?


不能。您不能假定gets不会更改堆栈上的值。它是它的参数,可以修改它。

另一方面,%ebx is callee-savegets函数必须保留它。

关于c - 此运动指令是否必要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29599253/

10-11 16:40