C++逆アセンブリ->ループ文解析
5240 ワード
まずコードを書きます.
DEBUGバージョンの分析:
do:関数を実行してから判断します.
while:まず判断してから関数を実行します.
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=9 0040164F . 68 C8104000 PUSH test5.004010C8 00401654 . 68 44004700 PUSH OFFSET test5.??_C@_04HPCL@tip1?$AA@ ; tip1 00401659 . 68 A0DE4700 PUSH OFFSET test5.std::cout 0040165E . E8 27FCFFFF CALL test5.0040128A 00401663 . 83C4 08 ADD ESP,8 00401666 . 8BC8 MOV ECX,EAX 00401668 . E8 73FBFFFF CALL test5.004011E0 ; for 0040166D . C745 F8 00000>MOV DWORD PTR SS:[EBP-8],0 ; int i=0 00401674 . EB 09 JMP SHORT test5.0040167F 00401676 > 8B45 F8 MOV EAX,DWORD PTR SS:[EBP-8] 00401679 . 83C0 01 ADD EAX,1 ; 1 0040167C . 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.004010C8 0040168C . 8B55 F8 MOV EDX,DWORD PTR SS:[EBP-8] 0040168F . 52 PUSH EDX ; out i 00401690 . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout 00401695 . E8 65FAFFFF CALL test5.004010FF 0040169A . 8BC8 MOV ECX,EAX 0040169C . E8 3FFBFFFF CALL test5.004011E0 004016A1 .^ EB D3 JMP SHORT test5.00401676 ; 00401676 004016A3 > 68 C8104000 PUSH test5.004010C8 004016A8 . 68 3C004700 PUSH OFFSET test5.??_C@_04IAJC@tip2?$AA@ ; tip2 004016AD . 68 A0DE4700 PUSH OFFSET test5.std::cout 004016B2 . E8 D3FBFFFF CALL test5.0040128A 004016B7 . 83C4 08 ADD ESP,8 004016BA . 8BC8 MOV ECX,EAX 004016BC . E8 1FFBFFFF CALL test5.004011E0 ; do 004016C1 > 68 C8104000 PUSH test5.004010C8 004016C6 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4] 004016C9 . 50 PUSH EAX ; out a 004016CA . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout 004016CF . E8 2BFAFFFF CALL test5.004010FF 004016D4 . 8BC8 MOV ECX,EAX 004016D6 . E8 05FBFFFF CALL test5.004011E0 004016DB . 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],ECX 004016E4 . 837D FC 00 CMP DWORD PTR SS:[EBP-4],0 ; 0 a 004016E8 .^ 75 D7 JNZ SHORT test5.004016C1 ; 0 a 004016C1 004016EA . 68 C8104000 PUSH test5.004010C8 004016EF . 68 34004700 PUSH OFFSET test5.??_C@_04CKAF@tip3?$AA@ ; tip3 004016F4 . 68 A0DE4700 PUSH OFFSET test5.std::cout 004016F9 . E8 8CFBFFFF CALL test5.0040128A 004016FE . 83C4 08 ADD ESP,8 00401701 . 8BC8 MOV ECX,EAX 00401703 . 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.004010C8 00401713 . 8B55 FC MOV EDX,DWORD PTR SS:[EBP-4] 00401716 . 52 PUSH EDX ; out a 00401717 . B9 A0DE4700 MOV ECX,OFFSET test5.std::cout 0040171C . E8 DEF9FFFF CALL test5.004010FF 00401721 . 8BC8 MOV ECX,EAX 00401723 . E8 B8FAFFFF CALL test5.004011E0 00401728 . 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],EAX 00401731 .^ EB D5 JMP SHORT test5.00401708 00401733 > 68 C8104000 PUSH test5.004010C8 00401738 . 68 2C004700 PUSH OFFSET test5.??_C@_04HPOA@tip4?$AA@ ; tip4 0040173D . 68 A0DE4700 PUSH OFFSET test5.std::cout 00401742 . E8 43FBFFFF CALL test5.0040128A 00401747 . 83C4 08 ADD ESP,8 0040174A . 8BC8 MOV ECX,EAX 0040174C . E8 8FFAFFFF CALL test5.004011E0 00401751 . 6A 09 PUSH 9 00401753 . E8 CEFAFFFF CALL test5.00401226 00401758 . 83C4 04 ADD ESP,4 0040175B . 68 24004700 PUSH OFFSET test5.??_C@_05PBCN@pause?$AA@ ; /pause 00401760 . E8 FBF30100 CALL test5.system ; \system
ノット:for:初期化してから、関数を実行すると判断します.do:関数を実行してから判断します.
while:まず判断してから関数を実行します.