在個人抽象中執行邏輯有三種-順序、選擇、循環。默認彙編就是從上到下順序執行,選擇用if-else和switch,循環用while、for等。性能
int main(int argc, char const *argv[]) { int a=10; if (a>10){ printf("a>10"); }else{ printf("a<=10"); } return 0;
int main(int argc, char const *argv[]) { int a=10; if (a>10){ printf("a>10"); }else if(a<2){ printf("a<2"); }else{ printf("2<=a<=10"); } return 0; }
從上面兩個二分支和三分支能夠看出:測試
int main(int argc, char const *argv[]) { int a=11; switch (a) { case 10: printf("a=10"); break; case 11: printf("a=11"); break; case 12: printf("a=12"); break; case 13: printf("a=13");c break; case 14: printf("a=14"); break; default: printf("!!"); } return 0; }
從分支語句中咱們能夠總結一些特徵,測試條件用cmp、fcmp等指令,下面緊跟着jcc指令。jmp表明這個分支執行完了,通常跳出這個分支檢測結構,而上面的cmp;jcc連着用的話通常指緊跟着的分支的否認,通常會跳到最後一個分支。switch在大量、連續的分支測試比if-else性能高。3d
for (a=0;a<10;a++){ sum=sum+a; }
80483ef: c7 45 f8 00 00 00 00 mov DWORD PTR [ebp-0x8],0x0 80483f6: eb 0a jmp 8048402 <main+0x27> sum=sum+a; 80483f8: 8b 45 f8 mov eax,DWORD PTR [ebp-0x8] 80483fb: 01 45 fc add DWORD PTR [ebp-0x4],eax for (a=0;a<10;a++){ 80483fe: 83 45 f8 01 add DWORD PTR [ebp-0x8],0x1 8048402: 83 7d f8 09 cmp DWORD PTR [ebp-0x8],0x9 8048406: 7e f0 jle 80483f8 <main+0x1d>
初始化 a=0 mov DWORD PTR [ebp-0x8],0x0 條件判斷,能夠看到cmp;jcc;判斷 cmp DWORD PTR [ebp-0x8],0x9 jle 80483f8 <main+0x1d> 控制變量變化 DWORD PTR [ebp-0x8],0x1 從上到下執行,首先初始化變量,接着直接jmp到cmp判斷循環變量,向上跳到循環體
for (a=0;a<10;a++){ if (a == 6){ continue; } if (a == 7){ break; } sum=sum+a; }
80483ef: c7 45 f8 00 00 00 00 mov DWORD PTR [ebp-0x8],0x0 80483f6: eb 19 jmp 8048411 <main+0x36> 80483f8: 83 7d f8 06 cmp DWORD PTR [ebp-0x8],0x6 80483fc: 74 0e je 804840c <main+0x31> 80483fe: 83 7d f8 07 cmp DWORD PTR [ebp-0x8],0x7 8048402: 74 15 je 8048419 <main+0x3e> 8048404: 8b 45 f8 mov eax,DWORD PTR [ebp-0x8] 8048407: 01 45 fc add DWORD PTR [ebp-0x4],eax 804840a: eb 01 jmp 804840d <main+0x32> 804840c: 90 nop 804840d: 83 45 f8 01 add DWORD PTR [ebp-0x8],0x1 8048411: 83 7d f8 09 cmp DWORD PTR [ebp-0x8],0x9 8048415: 7e e1 jle 80483f8 <main+0x1d> 8048417: eb 01 jmp 804841a <main+0x3f> 8048419: 90 nop 804841a: b8 00 00 00 00 mov eax,0x0 804841f: c9 leave 8048420: c3 ret
break跳出循環jmp 804840dcode
continue跳到循環變量控制也就是a++;add DWORD PTR [ebp-0x8],0x1blog
for循環典型特徵jmp指令,循環體,條件控制和判斷。jmp跳條件控制和判斷,而後回調循環體。編譯器