这段代码是什么意思啊?
时间:2011-11-18
来源:互联网
int main()
{
int i=0;
i++;
return 0;
}
以下是对应的汇编,,刚学汇编,看不懂
高手能帮忙解释一下吗??
Assembly code
其中先把ebp中的内容压倒栈中,
把esp栈的寄存器中的内容放到ebp中最后把ebp中的内容再mov到esp中。。。。。
这个我理解,防止esp被改变。。
为什么要 sub esp, 44H呢??
44H是一个0100 0100 的数字啊??
有什么用啊??
问题3:
{
int i=0;
i++;
return 0;
}
以下是对应的汇编,,刚学汇编,看不懂
高手能帮忙解释一下吗??
Assembly code
5: int main() 6: { 00401030 push ebp 00401031 mov ebp,esp 00401033 sub esp,44h 00401036 push ebx 00401037 push esi 00401038 push edi 00401039 lea edi,[ebp-44h] 0040103C mov ecx,11h //ecx是计数器,把0001 0001放到其中做什么啊??? 00401041 mov eax,0CCCCCCCCh //这里也是??? 00401046 rep stos dword ptr [edi] 7: 8: int i=0; 00401048 mov dword ptr [ebp-4],0 //为什么是4??? 9: i++; 0040104F mov eax,dword ptr [ebp-4] 00401052 add eax,1 00401055 mov dword ptr [ebp-4],eax 10: 11: return 0; 00401058 xor eax,eax //xor是异或运算吧? 意思是eax让其为0,这是为什么啊??? 12: } 0040105A pop edi 0040105B pop esi 0040105C pop ebx 0040105D mov esp,ebp 0040105F pop ebp 00401060 ret
其中先把ebp中的内容压倒栈中,
把esp栈的寄存器中的内容放到ebp中最后把ebp中的内容再mov到esp中。。。。。
这个我理解,防止esp被改变。。
为什么要 sub esp, 44H呢??
44H是一个0100 0100 的数字啊??
有什么用啊??
问题3:
作者: chouxiaoya1112 发布时间: 2011-11-18
太简单了。
Assembly code
Assembly code
5: int main() 6: { 00401030 push ebp ;保存旧值,以便出去时恢复 00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针, ;它只作基准,一旦进场,一般不变值) 00401033 sub esp,44h ;为局部变量留出空间(VC编译器对这个缓冲区通常留得都有富余) 00401036 push ebx ;保护可能被破坏的寄存器 00401037 push esi ;保护可能被破坏的寄存器 00401038 push edi ;保护可能被破坏的寄存器 00401039 lea edi,[ebp-44h] ;edi取局部变量空间的首地址 0040103C mov ecx,11h ;共要循环11次 00401041 mov eax,0CCCCCCCCh;就用它来清栈上留的空间(每个字节清为c,用cc是有讲究的) 00401046 rep stos dword ptr [edi] ;循环清 7: 8: int i=0; 00401048 mov dword ptr [ebp-4],0 ;局部变量i 是个双字,初始值为0 9: i++; 0040104F mov eax,dword ptr [ebp-4] ;将局部变量i赋给eax 00401052 add eax,1 ;eax = eax+1 00401055 mov dword ptr [ebp-4],eax ;再回填i(i不就i++了吗) 10: 11: return 0 ;C代码的这个返回值是通过eax传递的。 00401058 xor eax,eax ;eax=0(eax是返回值,是个重要的参数) 12: } 0040105A pop edi ;恢复保存的寄存器的旧值 0040105B pop esi ;(也就是还原到进来之前的状态) 0040105C pop ebx ;(同上) 0040105D mov esp,ebp ;esp还原刚进门时的值 0040105F pop ebp ;还原进门时保存的ebp 00401060 ret ;返回调用者(它要弹出压在栈上的EIP)
作者: gsy999 发布时间: 2011-11-18
最后那个ret 是回到 CRTMain吧??
引用 1 楼 gsy999 的回复:
太简单了。
Assembly code
5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
;它只作基准,一旦进场,一般不变值)
004……
太简单了。
Assembly code
5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
;它只作基准,一旦进场,一般不变值)
004……
作者: qunqun2012 发布时间: 2011-11-18
另外:eip没有看到push eip;
貌似是:CRTMain调用main的时候push 了eip,不知道这么理解对不对?
不对 ,请指出,谢谢
第二个问题:
call __chkesp (00420570)
一般我见到的call 一个符号,可是这条指令有些奇怪, 为什么有括号呢???
貌似是:CRTMain调用main的时候push 了eip,不知道这么理解对不对?
不对 ,请指出,谢谢
第二个问题:
call __chkesp (00420570)
一般我见到的call 一个符号,可是这条指令有些奇怪, 为什么有括号呢???
引用 2 楼 qunqun2012 的回复:
最后那个ret 是回到 CRTMain吧??
引用 1 楼 gsy999 的回复:
太简单了。
Assembly code
5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
;它……
最后那个ret 是回到 CRTMain吧??
引用 1 楼 gsy999 的回复:
太简单了。
Assembly code
5: int main()
6: {
00401030 push ebp ;保存旧值,以便出去时恢复
00401031 mov ebp,esp ;让ebp=esp(ebp是栈操作的重要一个定位指针,
;它……
作者: qunqun2012 发布时间: 2011-11-19
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28