我读了《计算机系统程序员的观点》教科书。它给出了一个示例程序:
/* 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-save。 gets
函数必须保留它。
关于c - 此运动指令是否必要?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29599253/