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

先写个代码:

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:先判断,再执行函数。

你可能感兴趣的:(C++反汇编->循环语句分析)