C++反汇编->循环语句分析

来源:互联网 发布:rsa512算法 编辑:程序博客网 时间:2024/05/22 14:35

先写个代码:

void main(){    int a=9;    cout<<"tip1"<<endl;for (int i=0;i<a;i++){cout<<i<<endl;}    cout<<"tip2"<<endl;do {    cout<<a<<endl;a--;} while (a);cout<<"tip3"<<endl;    while(a<9){cout<<a<<endl;a++;}cout<<"tip4"<<endl;    system("pause");}


DEBUG版本的分析:

00401648   .  C745 FC 09000>MOV DWORD PTR SS:[EBP-4],9                      ;  a=90040164F   .  68 C8104000   PUSH test5.004010C800401654   .  68 44004700   PUSH OFFSET test5.??_C@_04HPCL@tip1?$AA@        ;  tip100401659   .  68 A0DE4700   PUSH OFFSET test5.std::cout0040165E   .  E8 27FCFFFF   CALL test5.0040128A00401663   .  83C4 08       ADD ESP,800401666   .  8BC8          MOV ECX,EAX00401668   .  E8 73FBFFFF   CALL test5.004011E0                             ;  下面开始for循环0040166D   .  C745 F8 00000>MOV DWORD PTR SS:[EBP-8],0                      ;  int i=000401674   .  EB 09         JMP SHORT test5.0040167F00401676   >  8B45 F8       MOV EAX,DWORD PTR SS:[EBP-8]00401679   .  83C0 01       ADD EAX,1                                       ;  累加10040167C   .  8945 F8       MOV DWORD PTR SS:[EBP-8],EAX                    ;  i++0040167F   >  8B4D F8       MOV ECX,DWORD PTR SS:[EBP-8]00401682   .  3B4D FC       CMP ECX,DWORD PTR SS:[EBP-4]                    ;  i与a比较大小00401685   .  7D 1C         JGE SHORT test5.004016A3                        ;  大于等于则跳转 执行cout<<"tip2"<<endl;结束循环00401687   .  68 C8104000   PUSH test5.004010C80040168C   .  8B55 F8       MOV EDX,DWORD PTR SS:[EBP-8]0040168F   .  52            PUSH EDX                                        ;  out i00401690   .  B9 A0DE4700   MOV ECX,OFFSET test5.std::cout00401695   .  E8 65FAFFFF   CALL test5.004010FF0040169A   .  8BC8          MOV ECX,EAX0040169C   .  E8 3FFBFFFF   CALL test5.004011E0004016A1   .^ EB D3         JMP SHORT test5.00401676                        ;  回跳到00401676004016A3   >  68 C8104000   PUSH test5.004010C8004016A8   .  68 3C004700   PUSH OFFSET test5.??_C@_04IAJC@tip2?$AA@        ;  tip2004016AD   .  68 A0DE4700   PUSH OFFSET test5.std::cout004016B2   .  E8 D3FBFFFF   CALL test5.0040128A004016B7   .  83C4 08       ADD ESP,8004016BA   .  8BC8          MOV ECX,EAX004016BC   .  E8 1FFBFFFF   CALL test5.004011E0                             ;  下面开始 do循环004016C1   >  68 C8104000   PUSH test5.004010C8004016C6   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]004016C9   .  50            PUSH EAX                                        ;  out a004016CA   .  B9 A0DE4700   MOV ECX,OFFSET test5.std::cout004016CF   .  E8 2BFAFFFF   CALL test5.004010FF004016D4   .  8BC8          MOV ECX,EAX004016D6   .  E8 05FBFFFF   CALL test5.004011E0004016DB   .  8B4D FC       MOV ECX,DWORD PTR SS:[EBP-4]004016DE   .  83E9 01       SUB ECX,1                                       ;  a++004016E1   .  894D FC       MOV DWORD PTR SS:[EBP-4],ECX004016E4   .  837D FC 00    CMP DWORD PTR SS:[EBP-4],0                      ;  0与a比较004016E8   .^ 75 D7         JNZ SHORT test5.004016C1                        ;  0小于等于a则跳转到 004016C1004016EA   .  68 C8104000   PUSH test5.004010C8004016EF   .  68 34004700   PUSH OFFSET test5.??_C@_04CKAF@tip3?$AA@        ;  tip3004016F4   .  68 A0DE4700   PUSH OFFSET test5.std::cout004016F9   .  E8 8CFBFFFF   CALL test5.0040128A004016FE   .  83C4 08       ADD ESP,800401701   .  8BC8          MOV ECX,EAX00401703   .  E8 D8FAFFFF   CALL test5.004011E0                             ;  开始while 循环00401708   >  837D FC 09    CMP DWORD PTR SS:[EBP-4],9                      ;  9与a比较0040170C   .  7D 25         JGE SHORT test5.00401733                        ;  9大于等于a则跳出0040170E   .  68 C8104000   PUSH test5.004010C800401713   .  8B55 FC       MOV EDX,DWORD PTR SS:[EBP-4]00401716   .  52            PUSH EDX                                        ;  out a00401717   .  B9 A0DE4700   MOV ECX,OFFSET test5.std::cout0040171C   .  E8 DEF9FFFF   CALL test5.004010FF00401721   .  8BC8          MOV ECX,EAX00401723   .  E8 B8FAFFFF   CALL test5.004011E000401728   .  8B45 FC       MOV EAX,DWORD PTR SS:[EBP-4]0040172B   .  83C0 01       ADD EAX,1                                       ;  a++0040172E   .  8945 FC       MOV DWORD PTR SS:[EBP-4],EAX00401731   .^ EB D5         JMP SHORT test5.0040170800401733   >  68 C8104000   PUSH test5.004010C800401738   .  68 2C004700   PUSH OFFSET test5.??_C@_04HPOA@tip4?$AA@        ;  tip40040173D   .  68 A0DE4700   PUSH OFFSET test5.std::cout00401742   .  E8 43FBFFFF   CALL test5.0040128A00401747   .  83C4 08       ADD ESP,80040174A   .  8BC8          MOV ECX,EAX0040174C   .  E8 8FFAFFFF   CALL test5.004011E000401751   .  6A 09         PUSH 900401753   .  E8 CEFAFFFF   CALL test5.0040122600401758   .  83C4 04       ADD ESP,40040175B   .  68 24004700   PUSH OFFSET test5.??_C@_05PBCN@pause?$AA@       ; /pause00401760   .  E8 FBF30100   CALL test5.system                               ; \system
小结:for:先初始化,然后判断,执行函数。

         do:先执行函数,再判断。

        while:先判断,再执行函数。

0 0
原创粉丝点击