【发布时间】:2016-05-23 06:55:25
【问题描述】:
考虑以下 C 函数:
void f1(int i)
{
int j=i+a;
}
int f2(int i)
{
return i+a;
}
以及他们的汇编语言翻译(由讲师提供):
#f1 translation :
subl $8, %esp
movl 12(%esp), %eax
movl %eax, 4(%esp)
movl 4(%esp), %eax
addl a, %eax
movl %eax, (%esp)
addl $8, %esp
ret
#f2 translation :
subl $8, %esp
movl 12(%esp), %eax
movl %eax, 4(%esp)
movl a, %eax
movl %eax, (%esp)
movl (%esp), %eax
addl 4(%esp), %eax
addl $8, %esp
ret
我试图画出并写下这两个汇编代码的每一步,但我根本看不出这两者是如何导致不同的 C 代码的。
按照惯例,寄存器 %eax 包含函数的返回值。如果我没记错的话,寄存器 %eax 在 BOTH 汇编代码的末尾包含值 (i+a) 尽管 f1 不返回任何内容。
1) 为什么会这样?究竟是什么表明一个函数正在返回一个值?
另外,在这两个代码中,我们有两行这样的两行:
movl %eax, (%esp)
movl (%esp), %eax
最后一个似乎是多余的,2) 不是吗?
【问题讨论】:
-
简单地说:你错了。
f1不返回任何内容,因为您不返回任何内容。没有return声明,因此您不会返回任何内容。就这么简单。即使%eax总是返回返回值,f1的返回值也会保持void。
标签: c assembly translation