看了谭文邵坚强的<天书夜读-从汇编语言到Windows内核编程>,其中有这么一段:
void myfunction(int a,int b)
{int c=a+b;
}
用VC做的反汇编代码
void myfunction(int a,int b)
{push ebp
mov ebp,esp
sub esp,0cch
push ebx
push esi
push edi
lea edi,[ebp-0cch]
mov ecx,33h
mov eax,0cccccccch
rep stos dword ptr [edi]
int c=a+b
mov eax,dword ptr[a]
add eax,dword ptr[b]
mov dword ptr[c],eax
}
pop edi
pop esi
pop ebx
mov esp,ebp
pop ebp
ret
其中有一段非常不明白,那就是
sub esp,0cch
push ebx
push esi
push edi
lea edi,[ebp-0cch]
mov ecx,33h
mov eax,0cccccccch
rep stos dword ptr [edi]
这一段,大致意思是在堆栈中腾出一个区域用来保存局部变量,也就是常说的所谓局部变量保存在栈空间中,但奇怪的是总共三个局部变量,却腾出了0cch=204个字节的空间,能存大约51个变量,这是不是也太浪费了呀,为什么要这样呀
------解决思路----------------------
通常是不会这样的吧,这个好像的防数据溢出和堆栈检查方面的个手段,普通的默认的选项是不会这么做的。
另外,你这里不是 3 个变量,只有一个变量 c,a 和 b 是参数,不属该函数的变量。
------解决思路----------------------
看的云里雾里啊
------解决思路----------------------
用优化模式编译的么?如果你觉得浪费了,可以全部用汇编手写.