有奖征集活动系列——【HTML5游戏编程之旅】
博客导入工具
【限时优惠】第五届云计算大会社区门票抢购
探究云计算数据中心节能增效之道 CSDN博客第一期云计算最佳博主评选 CSDN博客第二期最佳移动开发博主评选
探究云计算数据中心节能增效之道 CSDN博客第一期云计算最佳博主评选 CSDN博客第二期最佳移动开发博主评选
今天继续简单反汇编之for循环,先看c++源码:
- #include "stdafx.h"
- void test(int a,int b)
- {
- int c=1;
- for(int i=0;i<10;i++)
- {
- c=c+a+b+i;
- }
- printf("%d/n",c);
- }
- int main(int argc, char* argv[])
- {
- test(1,2);
- return 0;
- }
先来分析debug版本的,F10 Go To Disassembly,因为main函数里面就一个调用test函数代码,所以就不列出了,具体看test函数代码:
- 3: void test(int a,int b)
- 4: {
- 00401020 push ebp
- 00401021 mov ebp,esp
- 00401023 sub esp,48h
- 00401026 push ebx
- 00401027 push esi
- 00401028 push edi
- 00401029 lea edi,[ebp-48h]
- 0040102C mov ecx,12h
- 00401031 mov eax,0CCCCCCCCh
- 00401036 rep stos dword ptr [edi]
- 5: int c=1;
- 00401038 mov dword ptr [ebp-4],1 //初始化第一个变量,并赋值为1
- 6: for(int i=0;i<10;i++)
- 0040103F mov dword ptr [ebp-8],0 //初始化第二个变量,并赋值为0
- 00401046 jmp test+31h (00401051) //直接跳转00401051
- 00401048 mov eax,dword ptr [ebp-8] //取出第二个变量放入eax
- 0040104B add eax,1 //eax+1
- 0040104E mov dword ptr [ebp-8],eax //eax的值放入第二个变量
- 00401051 cmp dword ptr [ebp-8],0Ah //用第二个变量和10比较
- 00401055 jge test+48h (00401068) //大于等于跳转到00401068
- 7: {
- 8: c=c+a+b+i;
- 00401057 mov ecx,dword ptr [ebp-4] //第一个变量放入ecx
- 0040105A add ecx,dword ptr [ebp+8] //第一个变量+第一个参数,结果放入ecx
- 0040105D add ecx,dword ptr [ebp+0Ch]//ecx+第二个参数,结果放入ecx
- 00401060 add ecx,dword ptr [ebp-8] //ecx+第二个变量,结果放入ecx
- 00401063 mov dword ptr [ebp-4],ecx //把最后的结果放入第一个变量
- 9: }
- 00401066 jmp test+28h (00401048) //跳转到上面进行判断
- 10: printf("%d/n",c);
- 00401068 mov edx,dword ptr [ebp-4] //把第一个变量放入edx
- 0040106B push edx //参数入栈
- 0040106C push offset string "%d" (0042201c) //入栈字符
- 00401071 call printf (00401100) //调用打印
- 00401076 add esp,8 //清理堆栈
- 11: }
- 00401079 pop edi
- 0040107A pop esi
- 0040107B pop ebx
- 0040107C add esp,48h
- 0040107F cmp ebp,esp
- 00401081 call __chkesp (00401180)
- 00401086 mov esp,ebp
- 00401088 pop ebp
- 00401089 ret
下面分析下代码如下:
- 00401000 8B5424 08 MOV EDX,DWORD PTR SS:[ESP+8] //第二个参数放入edx中
- 00401004 56 PUSH ESI //入栈esi
- 00401005 8B7424 08 MOV ESI,DWORD PTR SS:[ESP+8] //第一个参数放入esi中
- 00401009 57 PUSH EDI //入栈edi
- 0040100A B9 01000000 MOV ECX,1 //ecx初始化1
- 0040100F 33C0 XOR EAX,EAX //eax清0
- 00401011 8D3C30 LEA EDI,DWORD PTR DS:[EAX+ESI] //将偏移值放入edi中,其实就是计算eax+esi的值(这步其实是i+a,将结果放入edi中)
- 00401014 03FA ADD EDI,EDX //这步其实是edi+b就等于i+a+b,结果放入edi中
- 00401016 03CF ADD ECX,EDI //这步i+a+b+c结果放入ecx中,这里可以看出ecx也就是变量c
- 00401018 40 INC EAX //eax也就是变量i,自增1
- 00401019 83F8 0A CMP EAX,0A //a跟10比较
- 0040101C 7C F3 JL SHORT asm_for.00401011 //小于跳转到00401011,继续循环
- 0040101E 51 PUSH ECX //循环完之后走到这里入栈显示参数
- 0040101F 68 30704000 PUSH asm_for.00407030 //入栈字符
- 00401024 E8 17000000 CALL asm_for.00401040 //调用打印call
- 00401029 83C4 08 ADD ESP,8 //清理堆栈
- 0040102C 5F POP EDI
- 0040102D 5E POP ESI //出栈,跟前面相对应
- 0040102E C3 RETN
- 0040102F 90 NOP
- 00401030 6A 02 PUSH 2 //函数入口压入2个参数
- 00401032 6A 01 PUSH 1
- 00401034 E8 C7FFFFFF CALL asm_for.00401000 //调用test
- 00401039 83C4 08 ADD ESP,8 //清理堆栈
- 0040103C 33C0 XOR EAX,EAX
- 0040103E C3 RETN
可以看出同样的代码反汇编出来的汇编代码却很大不同,但是结果都是一样,也就是说编译器在优化代码的时候是不会改变代码的流程及处理结果,只是针对算法做了优化处理。
- 上一篇:简单反汇编之if判断
- 下一篇:简单反汇编之狐狸吃兔子算法
暂无评论
- 个人资料
-
- 访问:35950次
- 积分:931分
- 排名:第11233名
- 原创:56篇
- 转载:10篇
- 译文:0篇
- 评论:20条
- 文章搜索
- 阅读排行
- (6659)
- (2059)
- (1795)
- (1387)
- (1329)
- (1324)
- (1306)
- (1297)
- (883)
- (870)
- 评论排行
- (6)
- (5)
- (2)
- (2)
- (1)
- (1)
- (1)
- (1)
- (1)
- (0)
- 推荐文章
- 最新评论
: 广告做的真垃圾
: 好用
: 学习学习~
: 谢谢,学习了
: 我最近也遇到了这个问题,写的很好、、呵呵
: 学到东西...
: 其他人已经吐糟了 这是什么代理Irp啊只不过保存了原来的Irp指针吧!
: 呵呵 不错 学习了
: 非常的不错,学习了。
: 不错!