vc6.0选择的汇编

本文探讨了汇编语言中if和switch选择语句的具体实现方式,包括使用比较和跳转指令来实现不同的逻辑分支。通过对具体示例的分析,揭示了这些常见控制结构在底层是如何工作的。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

呵呵,有时间看看汇编代码,今天看选择语句的.

  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://初始化函数栈
  17. 7:        int i=1;
  18. 00401268   mov         dword ptr [ebp-4],1
  19. 8:        int a=0;
  20. 0040126F   mov         dword ptr [ebp-8],0
  21. 9:        if(i>=1)
  22. 00401276   cmp         dword ptr [ebp-4],1
  23. 0040127A   jl          main+35h (00401285)
  24. 10:       {
  25. 11:           a++;
  26. 0040127C   mov         eax,dword ptr [ebp-8]
  27. 0040127F   add         eax,1
  28. 00401282   mov         dword ptr [ebp-8],eax
  29. 12:       };
  30. 13:
  31. 14:
  32. 15:   }
  33. 00401285   pop         edi
  34. 00401286   pop         esi
  35. 00401287   pop         ebx
  36. 00401288   mov         esp,ebp
  37. 0040128A   pop         ebp
  38. 0040128B   ret

由于前面的分析,if语句比较简单.看switch语句.

  1. --- F:/1/1.cpp  ----------------------------------------------------------------------------------------------------------
  2. 1:    #include <iostream>
  3. 2:    using namespace std;
  4. 3:
  5. 4:    int main()
  6. 5:    {
  7. 00401780   push        ebp
  8. 00401781   mov         ebp,esp
  9. 00401783   sub         esp,48h
  10. 00401786   push        ebx
  11. 00401787   push        esi
  12. 00401788   push        edi
  13. 00401789   lea         edi,[ebp-48h]
  14. 0040178C   mov         ecx,12h
  15. 00401791   mov         eax,0CCCCCCCCh
  16. 00401796   rep stos    dword ptr [edi]
  17. 6:        int a=1;
  18. 00401798   mov         dword ptr [ebp-4],1
  19. 7:        switch(a)
  20. 8:        {
  21. 0040179F   mov         eax,dword ptr [ebp-4]//
  22. 004017A2   mov         dword ptr [ebp-8],eax//注意这两句,用了一个临时变量
  23. //注意下面这一块,一起比较,跳转
  24. 004017A5   cmp         dword ptr [ebp-8],0
  25. 004017A9   je          main+39h (004017b9)
  26. 004017AB   cmp         dword ptr [ebp-8],1
  27. 004017AF   je          main+44h (004017c4)
  28. 004017B1   cmp         dword ptr [ebp-8],2
  29. 004017B5   je          main+4Fh (004017cf)
  30. 004017B7   jmp         main+58h (004017d8)
  31. 9:            case 0:
  32. 10:                   a++;
  33. 004017B9   mov         ecx,dword ptr [ebp-4]
  34. 004017BC   add         ecx,1
  35. 004017BF   mov         dword ptr [ebp-4],ecx
  36. 11:                   break;
  37. 004017C2   jmp         main+58h (004017d8)  //此处也值的注意
  38. 12:           case 1:
  39. 13:                  a++;
  40. 004017C4   mov         edx,dword ptr [ebp-4]
  41. 004017C7   add         edx,1
  42. 004017CA   mov         dword ptr [ebp-4],edx
  43. 14:                  break;
  44. 004017CD   jmp         main+58h (004017d8)//此处也值的注意
  45. 15:           case 2:
  46. 16:                  a++;
  47. 004017CF   mov         eax,dword ptr [ebp-4]
  48. 004017D2   add         eax,1
  49. 004017D5   mov         dword ptr [ebp-4],eax//此处也值的注意
  50. 17:                  break;
  51. 18:           default:
  52. 19:
  53. 20:                  break;//注意这句没有汇编语句
  54. 21:       }
  55. 22:       cout<<a<<endl;
  56. 004017D8   push        offset @ILT+195(std::endl) (004010c8)
  57. 004017DD   mov         ecx,dword ptr [ebp-4]
  58. 004017E0   push        ecx
  59. 004017E1   mov         ecx,offset std::cout (0047be90)
  60. 004017E6   call        @ILT+250(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004010ff)
  61. 004017EB   mov         ecx,eax
  62. 004017ED   call        @ILT+475(std::basic_ostream<char,std::char_traits<char> >::operator<<) (004011e0)
  63. 23:       return 0;
  64. 004017F2   xor         eax,eax////此处也值的注意
  65. 24:
  66. 25:   }
  67. 004017F4   pop         edi
  68. 004017F5   pop         esi
  69. 004017F6   pop         ebx
  70. 004017F7   add         esp,48h
  71. 004017FA   cmp         ebp,esp
  72. 004017FC   call        __chkesp (00420570)
  73. 00401801   mov         esp,ebp
  74. 00401803   pop         ebp
  75. 00401804   ret

 

总结:选择语句的实现也是用了比较和跳转的指令.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值