这个movl指令是否必要?

时间:2015-04-13 06:42:13

标签: c assembly

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

/* 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。然后它调用gets。返回时,buf将位于堆栈的顶部。

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

编辑:这是Linux。

2 个答案:

答案 0 :(得分:5)

  

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

没有。您不能假设gets不会更改堆栈上的值。这是它的论点,允许修改它。

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

答案 1 :(得分:0)

当你调用gets函数时,可能会发生它可以修改参数的值(在你的情况下为%ebx)。因为你还没有提到代码的其他部分,所以不能说明......但是在函数调用之后再次将buff存储到堆栈顶部是好的。