VC6.0循环的汇编
来源:互联网 发布:it产业 编辑:程序博客网 时间:2024/05/17 08:58
今天突然来了兴趣,想看看汇编级的循环.
- #include <iostream>
- using namespace std;
- int main()
- {
- int a=0;
- for(int i=0;i<10;i++)
- {
- a++;
- }
- }
- 1: #include <iostream>
- 2: using namespace std;
- 3:
- 4: int main()
- 5: {
- 00401250 push ebp
- 00401251 mov ebp,esp
- 00401253 sub esp,48h
- 00401256 push ebx
- 00401257 push esi
- 00401258 push edi
- 00401259 lea edi,[ebp-48h]
- 0040125C mov ecx,12h
- 00401261 mov eax,0CCCCCCCCh
- 00401266 rep stos dword ptr [edi]
- 6: int a=0;
- 00401268 mov dword ptr [ebp-4],0
- 7: for(int i=0;i<10;i++)
- 0040126F mov dword ptr [ebp-8],0
- 00401276 jmp main+31h (00401281)
- 00401278 mov eax,dword ptr [ebp-8]
- 0040127B add eax,1
- 0040127E mov dword ptr [ebp-8],eax
- 00401281 cmp dword ptr [ebp-8],0Ah
- 00401285 jge main+42h (00401292)
- 8: {
- 9: a++;
- 00401287 mov ecx,dword ptr [ebp-4]
- 0040128A add ecx,1
- 0040128D mov dword ptr [ebp-4],ecx
- 10: }
- 00401290 jmp main+28h (00401278)
- 11:
- 12: }
- 00401292 pop edi
- 00401293 pop esi
- 00401294 pop ebx
- 00401295 mov esp,ebp
- 00401297 pop ebp
- 00401298 ret
- 6: int a=0;
- 00401268 mov dword ptr [ebp-4],0//保存a的值
- 7: for(int i=0;i<10;i++)
- 0040126F mov dword ptr [ebp-8],0// 保存i的值
- 00401276 jmp main+31h (00401281)//跳转到比较指令
- 00401278 mov eax,dword ptr [ebp-8]
- 0040127B add eax,1//eax 为临时变量
- 0040127E mov dword ptr [ebp-8],eax
- 00401281 cmp dword ptr [ebp-8],0Ah
- 00401285 jge main+42h (00401292)//大于等于10不进入循环体
- 8: {
- 9: a++;
- 00401287 mov ecx,dword ptr [ebp-4]
- 0040128A add ecx,1 //ecx为临时变量
- 0040128D mov dword ptr [ebp-4],ecx
- 10: }
- 00401290 jmp main+28h (00401278)
看看while循环
- #include <iostream>
- using namespace std;
- int main()
- {
- int a=0;
- int i=0;
- while(i<10)
- {
- a++;
- ++i;
- }
- }
- 1: #include <iostream>
- 2: using namespace std;
- 3:
- 4: int main()
- 5: {
- 00401250 push ebp
- 00401251 mov ebp,esp
- 00401253 sub esp,48h
- 00401256 push ebx
- 00401257 push esi
- 00401258 push edi
- 00401259 lea edi,[ebp-48h]
- 0040125C mov ecx,12h
- 00401261 mov eax,0CCCCCCCCh
- 00401266 rep stos dword ptr [edi]
- //上面是函数栈建立的过程
- 6: int a=0;
- 00401268 mov dword ptr [ebp-4],0
- 7: int i=0;
- 0040126F mov dword ptr [ebp-8],0
- 8: while(i<10)
- 00401276 cmp dword ptr [ebp-8],0Ah
- 0040127A jge main+40h (00401290)
- 9: {
- 10: a++;
- 0040127C mov eax,dword ptr [ebp-4]
- 0040127F add eax,1
- 00401282 mov dword ptr [ebp-4],eax
- 11: ++i;
- 00401285 mov ecx,dword ptr [ebp-8]
- 00401288 add ecx,1
- 0040128B mov dword ptr [ebp-8],ecx
- 12: }
- 0040128E jmp main+26h (00401276)
- 13:
- 14: }
- //下面是此层函数栈销毁的过程
- 00401290 pop edi
- 00401291 pop esi
- 00401292 pop ebx
- 00401293 mov esp,ebp
- 00401295 pop ebp
- 00401296 ret
- //先判断后跳转 ,程序比较简单
- #include <iostream>
- using namespace std;
- int main()
- {
- int a=0;
- int i=0;
- do
- {
- a++;
- ++i;
- }
- while(i<10);
- }
- VC6.0反汇编的代码
- 1: #include <iostream>
- 2: using namespace std;
- 3:
- 4: int main()
- 5: {
- 00401250 push ebp
- 00401251 mov ebp,esp
- 00401253 sub esp,48h
- 00401256 push ebx
- 00401257 push esi
- 00401258 push edi
- 00401259 lea edi,[ebp-48h]
- 0040125C mov ecx,12h
- 00401261 mov eax,0CCCCCCCCh
- 00401266 rep stos dword ptr [edi]
- 6://同上
- 7: int a=0;
- 00401268 mov dword ptr [ebp-4],0
- 8: int i=0;
- 0040126F mov dword ptr [ebp-8],0
- 9: do
- 10: {
- 11: a++;
- 00401276 mov eax,dword ptr [ebp-4]
- 00401279 add eax,1
- 0040127C mov dword ptr [ebp-4],eax
- 12: ++i;
- 0040127F mov ecx,dword ptr [ebp-8]
- 00401282 add ecx,1
- 00401285 mov dword ptr [ebp-8],ecx
- 13: }
- 14: while(i<10);
- 00401288 cmp dword ptr [ebp-8],0Ah
- 0040128C jl main+26h (00401276)
- 15:
- 16: }
- //同上
- 0040128E pop edi
- 0040128F pop esi
- 00401290 pop ebx
- 00401291 mov esp,ebp
- 00401293 pop ebp
- 00401294 ret
总结:看来循环语句是通过比较指令和跳转指令来实现的.
- 在看一个小代码:
- 7: int i=0;
- 00401268 mov dword ptr [ebp-4],0
- 8: int a=0;
- 0040126F mov dword ptr [ebp-8],0
- 9: i=a++;
- //通过EAX先赋值
- 00401276 mov eax,dword ptr [ebp-8]
- 00401279 mov dword ptr [ebp-4],eax
- //通过ECX加一
- 0040127C mov ecx,dword ptr [ebp-8]
- 0040127F add ecx,1
- 00401282 mov dword ptr [ebp-8],ecx
- 10: i=++a;
- //通过EDX加一
- 00401285 mov edx,dword ptr [ebp-8]
- 00401288 add edx,1
- 0040128B mov dword ptr [ebp-8],edx
- //通过EAX赋值
- 0040128E mov eax,dword ptr [ebp-8]
- 00401291 mov dword ptr [ebp-4],eax
初学者易混淆的地方.
- VC6.0循环的汇编
- vc6.0选择的汇编
- VC6.0循环语句
- vc6.0 查看汇编代码
- VC6.0查看汇编代码
- VC6.0反汇编代码
- VC6.0如何看它生成的汇编代码
- 汇编的循环
- VC6调试进入汇编模式的问题
- VC6.0 -if-else嵌套汇编
- vc6.0 c语言调用汇编
- 汇编里面的for循环
- 循环语句的汇编表示
- 死循环在BEAB BKPT 0xAB汇编的解决办法
- 死循环在BEAB BKPT 0xAB汇编的解决办法
- 死循环在BEAB BKPT 0xAB汇编的解决办法
- 我的vc6.0怎么不能运行内联汇编呢!谁能帮我解释一下,不胜感激。
- VC6.0和VS2005查看查看C或者C++文件汇编代码的方法
- 打印功能探求之路四
- el表达式函数的用法
- 让你全面了解当前世界金融危机
- 链表重复元素的统计
- hibernate 延迟加载(Lazy)问题spring下解决方法
- VC6.0循环的汇编
- C#_委托
- Web发布cab文件打包的ActiveX控件总结
- 有关3S产业前景的一些思考
- MY SQL常用命令
- struts2 工作原理图
- 久违的日记
- 示波器探头的使用注意事项
- php 正则表达式