逆向-邏輯流控制

邏輯流控制

在個人抽象中執行邏輯有三種-順序、選擇、循環。默認彙編就是從上到下順序執行,選擇用if-else和switch,循環用while、for等。性能

分支語句

if-else

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;
}

從上面兩個二分支和三分支能夠看出:測試

  1. 開始標誌就是cmp,jcc 這兩條標誌語句,表明條件判斷。
  2. 直接跳轉的jmp表明執行的是它上面的分支。
  3. 每一個分支內jmp跳的地址是同樣的都是else{};這條語句以後的位置。
  4. 巧妙的運用了順序結構

switch

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;
}

特徵

  1. 當switch分支小的時候(視不一樣編譯器實現,visual studio 爲3個(包含)如下)返回百年結構和if-else結構相同,可是當分支測試的常量連續而且有必定數目,就會根據一個表保存要跳轉的地址。
  2. 若是不是從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判斷循環變量,向上跳到循環體

break和continue

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跳條件控制和判斷,而後回調循環體。編譯器

相關文章
相關標籤/搜索