这段汇编代码是不是有病呀

C2S2D2Nshishabi 2014-09-28 09:04:35
看了谭文邵坚强的<天书夜读-从汇编语言到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个变量,这是不是也太浪费了呀,为什么要这样呀
...全文
249 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
C2S2D2Nshishabi 2014-10-04
  • 打赏
  • 举报
回复
引用 1 楼 zara 的回复:
通常是不会这样的吧,这个好像的防数据溢出和堆栈检查方面的个手段,普通的默认的选项是不会这么做的。 另外,你这里不是 3 个变量,只有一个变量 c,a 和 b 是参数,不属该函数的变量。
这个是反汇编的代码
大熊猫侯佩 2014-10-01
  • 打赏
  • 举报
回复
用优化模式编译的么?如果你觉得浪费了,可以全部用汇编手写.
wang3132841 2014-10-01
  • 打赏
  • 举报
回复
看的云里雾里啊
zara 2014-09-29
  • 打赏
  • 举报
回复
通常是不会这样的吧,这个好像的防数据溢出和堆栈检查方面的个手段,普通的默认的选项是不会这么做的。
另外,你这里不是 3 个变量,只有一个变量 c,a 和 b 是参数,不属该函数的变量。

21,499

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧