VC6.0循环的汇编

来源:互联网 发布:it产业 编辑:程序博客网 时间:2024/05/17 08:58

今天突然来了兴趣,想看看汇编级的循环.

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {   
  5.     int a=0;
  6.     for(int i=0;i<10;i++)
  7.     {
  8.         a++;
  9.     }
  10.     
  11. }
  1. 1:    #include <iostream>
  2. 2:    using namespace std;
  3. 3:
  4. 4:    int main()
  5. 5:    {
  6. 00401250   push        ebp
  7. 00401251   mov         ebp,esp
  8. 00401253   sub         esp,48h
  9. 00401256   push        ebx
  10. 00401257   push        esi
  11. 00401258   push        edi
  12. 00401259   lea         edi,[ebp-48h]
  13. 0040125C   mov         ecx,12h
  14. 00401261   mov         eax,0CCCCCCCCh
  15. 00401266   rep stos    dword ptr [edi]
  16. 6:        int a=0;
  17. 00401268   mov         dword ptr [ebp-4],0
  18. 7:        for(int i=0;i<10;i++)
  19. 0040126F   mov         dword ptr [ebp-8],0
  20. 00401276   jmp         main+31h (00401281)
  21. 00401278   mov         eax,dword ptr [ebp-8]
  22. 0040127B   add         eax,1
  23. 0040127E   mov         dword ptr [ebp-8],eax
  24. 00401281   cmp         dword ptr [ebp-8],0Ah
  25. 00401285   jge         main+42h (00401292)
  26. 8:        {
  27. 9:            a++;
  28. 00401287   mov         ecx,dword ptr [ebp-4]
  29. 0040128A   add         ecx,1
  30. 0040128D   mov         dword ptr [ebp-4],ecx
  31. 10:       }
  32. 00401290   jmp         main+28h (00401278)
  33. 11:
  34. 12:   }
  35. 00401292   pop         edi
  36. 00401293   pop         esi
  37. 00401294   pop         ebx
  38. 00401295   mov         esp,ebp
  39. 00401297   pop         ebp
  40. 00401298   ret
  1. 6:        int a=0;
  2. 00401268   mov         dword ptr [ebp-4],0//保存a的值
  3. 7:        for(int i=0;i<10;i++)
  4. 0040126F   mov         dword ptr [ebp-8],0// 保存i的值
  5. 00401276   jmp         main+31h (00401281)//跳转到比较指令
  6. 00401278   mov         eax,dword ptr [ebp-8]
  7. 0040127B   add         eax,1//eax 为临时变量
  8. 0040127E   mov         dword ptr [ebp-8],eax
  9. 00401281   cmp         dword ptr [ebp-8],0Ah
  10. 00401285   jge         main+42h (00401292)//大于等于10不进入循环体
  11. 8:        {
  12. 9:            a++;
  13. 00401287   mov         ecx,dword ptr [ebp-4]
  14. 0040128A   add         ecx,1    //ecx为临时变量
  15. 0040128D   mov         dword ptr [ebp-4],ecx
  16. 10:       }
  17. 00401290   jmp         main+28h (00401278)

看看while循环

  1. #include <iostream>
  2. using namespace std;
  3. int main()
  4. {   
  5.     int a=0;
  6.     int i=0;
  7.     while(i<10)
  8.     {
  9.         a++;
  10.         ++i;
  11.     }
  12.     
  13. }

 

 

 

  1. 1:    #include <iostream>
  2. 2:    using namespace std;
  3. 3:
  4. 4:    int main()
  5. 5:    {
  6. 00401250   push        ebp
  7. 00401251   mov         ebp,esp
  8. 00401253   sub         esp,48h
  9. 00401256   push        ebx
  10. 00401257   push        esi
  11. 00401258   push        edi
  12. 00401259   lea         edi,[ebp-48h]
  13. 0040125C   mov         ecx,12h
  14. 00401261   mov         eax,0CCCCCCCCh
  15. 00401266   rep stos    dword ptr [edi]
  16. //上面是函数栈建立的过程
  17. 6:        int a=0;
  18. 00401268   mov         dword ptr [ebp-4],0
  19. 7:        int i=0;
  20. 0040126F   mov         dword ptr [ebp-8],0
  21. 8:        while(i<10)
  22. 00401276   cmp         dword ptr [ebp-8],0Ah
  23. 0040127A   jge         main+40h (00401290)
  24. 9:        {
  25. 10:           a++;
  26. 0040127C   mov         eax,dword ptr [ebp-4]
  27. 0040127F   add         eax,1
  28. 00401282   mov         dword ptr [ebp-4],eax
  29. 11:           ++i;
  30. 00401285   mov         ecx,dword ptr [ebp-8]
  31. 00401288   add         ecx,1
  32. 0040128B   mov         dword ptr [ebp-8],ecx
  33. 12:       }
  34. 0040128E   jmp         main+26h (00401276)
  35. 13:
  36. 14:   }
  37. //下面是此层函数栈销毁的过程
  38. 00401290   pop         edi
  39. 00401291   pop         esi
  40. 00401292   pop         ebx
  41. 00401293   mov         esp,ebp
  42. 00401295   pop         ebp
  43. 00401296   ret
  44. //先判断后跳转  ,程序比较简单

 

 

  1. #include <iostream> 
  2. using namespace std;
  3. int main()
  4. {   
  5.     
  6.     int a=0;
  7.     int i=0;
  8.     do
  9.     {
  10.         a++;
  11.         ++i;
  12.     }
  13.      while(i<10);
  14.     
  15. }
  16. VC6.0反汇编的代码
  17. 1:    #include <iostream>
  18. 2:    using namespace std;
  19. 3:
  20. 4:    int main()
  21. 5:    {
  22. 00401250   push        ebp
  23. 00401251   mov         ebp,esp
  24. 00401253   sub         esp,48h
  25. 00401256   push        ebx
  26. 00401257   push        esi
  27. 00401258   push        edi
  28. 00401259   lea         edi,[ebp-48h]
  29. 0040125C   mov         ecx,12h
  30. 00401261   mov         eax,0CCCCCCCCh
  31. 00401266   rep stos    dword ptr [edi]
  32. 6://同上 
  33. 7:        int a=0;
  34. 00401268   mov         dword ptr [ebp-4],0
  35. 8:        int i=0;
  36. 0040126F   mov         dword ptr [ebp-8],0
  37. 9:        do
  38. 10:       {
  39. 11:           a++;
  40. 00401276   mov         eax,dword ptr [ebp-4]
  41. 00401279   add         eax,1
  42. 0040127C   mov         dword ptr [ebp-4],eax
  43. 12:           ++i;
  44. 0040127F   mov         ecx,dword ptr [ebp-8]
  45. 00401282   add         ecx,1
  46. 00401285   mov         dword ptr [ebp-8],ecx
  47. 13:       }
  48. 14:        while(i<10);
  49. 00401288   cmp         dword ptr [ebp-8],0Ah
  50. 0040128C   jl          main+26h (00401276)
  51. 15:
  52. 16:   }
  53. //同上 
  54. 0040128E   pop         edi
  55. 0040128F   pop         esi
  56. 00401290   pop         ebx
  57. 00401291   mov         esp,ebp
  58. 00401293   pop         ebp
  59. 00401294   ret

总结:看来循环语句是通过比较指令和跳转指令来实现的.

 

 

  1. 在看一个小代码:
  2. 7:        int i=0;
  3. 00401268   mov         dword ptr [ebp-4],0
  4. 8:        int a=0;
  5. 0040126F   mov         dword ptr [ebp-8],0
  6. 9:        i=a++;
  7. //通过EAX先赋值
  8. 00401276   mov         eax,dword ptr [ebp-8]
  9. 00401279   mov         dword ptr [ebp-4],eax
  10. //通过ECX加一
  11. 0040127C   mov         ecx,dword ptr [ebp-8]
  12. 0040127F   add         ecx,1
  13. 00401282   mov         dword ptr [ebp-8],ecx
  14. 10:       i=++a;
  15. //通过EDX加一
  16. 00401285   mov         edx,dword ptr [ebp-8]
  17. 00401288   add         edx,1
  18. 0040128B   mov         dword ptr [ebp-8],edx
  19. //通过EAX赋值
  20. 0040128E   mov         eax,dword ptr [ebp-8]
  21. 00401291   mov         dword ptr [ebp-4],eax

初学者易混淆的地方.