如下简单代码:
int foo() { int a = 5; return a; } int main() { int b; b = foo(); return 0; }
本人看了下里面的汇编,在foo()中有下面几行代码:
int a = 5; 009E17CE mov dword ptr [a],5 return a; 009E17D5 mov eax,dword ptr [a]
问题1:这个eax是不是就是所谓的临时变量?
问题2:其它语言也和C++一样,需要临时变量来实现函数返回值吗?
解决方案
2
编译器有优化选项,优化级别高一点可以优化掉
2
编译的时候加上-o 或-o2,然后再看看
1
看看汇编语言吧
30
来少年 看debug的完整函数汇编代码
int foo()
{
00CB7200 push ebp
00CB7201 mov ebp,esp
00CB7203 sub esp,0CCh
00CB7209 push ebx
00CB720A push esi
00CB720B push edi
00CB720C lea edi,[ebp+FFFFFF34h]
00CB7212 mov ecx,33h
00CB7217 mov eax,0CCCCCCCCh
00CB721C rep stos dword ptr es:[edi]
int a = 5;
00CB721E mov dword ptr [ebp-8],5
return a;
00CB7225 mov eax,dword ptr [ebp-8]
}
问题1:这个eax是不是就是所谓的临时变量?
本人只想说 在c/c++中 99%的情况, 都是利用eax来保存函数的返回值,
然后调用函数的地方需要保存函数返回值, 会从eax读取函数的
b = foo();
00CB725E call 00CB5785
00CB7263 mov dword ptr [ebp-8],eax
如你的变量b 就是将eax的值去保存到b中 其中那这个[ebp-8]就是b的地址
所以eax这个东西是负责保存函数返回值
至于临不临时变量, 只能说eax保存了你这个临时变量a的值, 仅此而已
而所谓的a不过是ebp-8, 也就是esp sub出来的一个临时的地址
int a = 5;
00CB721E mov dword ptr [ebp-8],5
函数结束之后 肯定
00CB722B mov esp,ebp
00CB722D pop ebp
堆栈又平衡了 esp sub出去的地址又add回来了
问题2:其它语言也和C++一样,需要临时变量来实现函数返回值吗?
理由见上, 统一由eax保存函数返回值
int foo()
{
00CB7200 push ebp
00CB7201 mov ebp,esp
00CB7203 sub esp,0CCh
00CB7209 push ebx
00CB720A push esi
00CB720B push edi
00CB720C lea edi,[ebp+FFFFFF34h]
00CB7212 mov ecx,33h
00CB7217 mov eax,0CCCCCCCCh
00CB721C rep stos dword ptr es:[edi]
int a = 5;
00CB721E mov dword ptr [ebp-8],5
return a;
00CB7225 mov eax,dword ptr [ebp-8]
}
问题1:这个eax是不是就是所谓的临时变量?
本人只想说 在c/c++中 99%的情况, 都是利用eax来保存函数的返回值,
然后调用函数的地方需要保存函数返回值, 会从eax读取函数的
b = foo();
00CB725E call 00CB5785
00CB7263 mov dword ptr [ebp-8],eax
如你的变量b 就是将eax的值去保存到b中 其中那这个[ebp-8]就是b的地址
所以eax这个东西是负责保存函数返回值
至于临不临时变量, 只能说eax保存了你这个临时变量a的值, 仅此而已
而所谓的a不过是ebp-8, 也就是esp sub出来的一个临时的地址
int a = 5;
00CB721E mov dword ptr [ebp-8],5
函数结束之后 肯定
00CB722B mov esp,ebp
00CB722D pop ebp
堆栈又平衡了 esp sub出去的地址又add回来了
问题2:其它语言也和C++一样,需要临时变量来实现函数返回值吗?
理由见上, 统一由eax保存函数返回值
5
执行foo函数时,a是作为一个局部变量,存储在栈中,然后函数的返回值会存储到寄存器eax,函数返回后释放局部变量(也就是释放栈中的变量),但是返回的这个值是存储在寄存器所以是可以获取到函数的返回值的。