Cor*_*nus 0 c assembly translation
考虑以下C函数:
void f1(int i)
{
int j=i+a;
}
int f2(int i)
{
return i+a;
}
Run Code Online (Sandbox Code Playgroud)
以及汇编语言的翻译(由讲师给出):
#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
Run Code Online (Sandbox Code Playgroud)
我试图绘制并记下两个汇编代码的每一步,但我根本无法看到两者如何导致不同的C代码.
按照惯例,寄存器%eax包含函数的返回值.如果我没弄错,寄存器%eax包含两个汇编代码末尾的值(i + a),尽管f1 什么都不返回.
1)为什么?究竟是什么告诉函数返回一个值?
此外,在这两个代码中,我们有两行,如下所示:
movl %eax, (%esp)
movl (%esp), %eax
Run Code Online (Sandbox Code Playgroud)
最后一个似乎是多余的,2)或不是吗?
如果ABI表示EAX包含返回值,则返回某些内容的函数将具有返回值.如果函数没有返回任何内容,则寄存器可能包含任何内容.在这种情况下它可能是相同的值,我没有读取代码.
如果调用函数没有读取返回值,则该寄存器包含的内容无关紧要.所以关于调用者和被调用函数都是如此.他们必须遵守ABI.如果调用void函数,则调用代码将永远不会尝试将该寄存器用作任何东西.
因此汇编代码中没有任何内容表示函数返回了一些内容 它全部在C代码中.
至于2,这MOV是多余的.这是因为你没有使用优化进行编译,所以编译器只会输出它想要的任何简单的东西,而且非常不理想.
| 归档时间: |
|
| 查看次数: |
142 次 |
| 最近记录: |