【发布时间】:2014-03-12 22:32:10
【问题描述】:
这个 C++:
int my_func(int y, int t){
int m = 0;
m= y*t;
return m;
}
int main(){
int h = my_func(1,2);
return 1;
}
生产这个 x86:
int main(){
push ebp
mov ebp,esp
sub esp,8
int m = my_func(1,2);
mov dword ptr [ebp-4],0
mov eax,1
imul eax,eax,2
mov dword ptr [ebp-4],eax ;Why?
mov ecx,dword ptr [ebp-4] ;Why?
mov dword ptr [m],ecx ;Why?
return 1;
mov eax,1
}
mov esp,ebp
pop ebp
ret
我不明白为什么m 的值已经包含在寄存器eax 中,在imul 之后需要三个mov?
是不是因为eax 必须用于return 1 行,所以eax 是一个特殊的寄存器?
另外,dword ptr [ebp-4] 到底指的是什么?是1还是2?
【问题讨论】:
-
您是否使用任何级别的优化进行编译?
-
@Leeor 否,因为如果我这样做了,我不会有 imul 指令,我只会返回值 2....(我希望函数被内联)跨度>
-
冗余负载的原因是因为您选择构建未优化的代码。
-
+1 - 虽然编译器输出它所做的代码会有逻辑上的原因,但不进行优化的编译几乎总是会输出冗余代码。