C 언어 switch 문장의 어셈블리 언어 구현

5743 단어
 int test()
{
    int i,j;
    i=j=0;
   switch(i)
    {
       case 1:j+=1;break;
       case 2:j+=2;break;
       default:j+=5;
    }
    return 0;
}
         :
; 5    : 
; 6    :    switch(i)
    mov ecx, DWORD PTR _i$[ebp]
    mov DWORD PTR tv64[ebp], ecx
;case 1:
cmp DWORD PTR tv64[ebp], 1
    je  SHORT $LN3@test
;case 2:
cmp DWORD PTR tv64[ebp], 2
    je  SHORT $LN2@test
;default:
    jmp SHORT $LN1@test
$LN3@test:
; 7    :    {
; 8    :       case 1:j+=1;break;
    mov edx, DWORD PTR _j$[ebp]
    add edx, 1
    mov DWORD PTR _j$[ebp], edx
    jmp SHORT $LN4@test
$LN2@test:
; 9    :       case 2:j+=2;break;
    mov eax, DWORD PTR _j$[ebp]
    add eax, 2
    mov DWORD PTR _j$[ebp], eax
    jmp SHORT $LN4@test
$LN1@test:
; 10   :       default:j+=5;
    mov ecx, DWORD PTR _j$[ebp]
    add ecx, 5
    mov DWORD PTR _j$[ebp], ecx
$LN4@test:
; 11   :    }
; 12   : 
; 13   :    return 0;
    xor eax, eax
; 14   : }
            ,          。
           switch
int test()
{
    int i,j;
    i=j=0;
   switch(i)
    {
       case 1:j+=1;break;
       case 2:j+=2;break;
       case 3:j+=3;break;
       case 4:j+=4;break;
       default:j+=10;
    }
    return 0;
}
              :
; 5    : 
; 6    :    switch(i)
    mov ecx, DWORD PTR _i$[ebp]
    mov DWORD PTR tv64[ebp], ecx
    mov edx, DWORD PTR tv64[ebp]
    sub edx, 1
    mov DWORD PTR tv64[ebp], edx
    cmp DWORD PTR tv64[ebp], 3
    ja  SHORT $LN1@test
    mov eax, DWORD PTR tv64[ebp]
    jmp DWORD PTR $LN10@test[eax*4]
;                :
if(i-1 > 3)
{
    goto $LN1@test;//   default
}
else
{
    goto $LN10@test[i-1];//case 1,case 2,case 3,case 4   
}
$LN10@test      ,                  ,              ,      case       ,          。
$LN5@test:
; 7    :    {
; 8    :       case 1:j+=1;break;
    mov ecx, DWORD PTR _j$[ebp]
    add ecx, 1
    mov DWORD PTR _j$[ebp], ecx
    jmp SHORT $LN6@test
$LN4@test:
; 9    :       case 2:j+=2;break;
    mov edx, DWORD PTR _j$[ebp]
    add edx, 2
    mov DWORD PTR _j$[ebp], edx
    jmp SHORT $LN6@test
$LN3@test:
; 10   :       case 3:j+=3;break;
    mov eax, DWORD PTR _j$[ebp]
    add eax, 3
    mov DWORD PTR _j$[ebp], eax
    jmp SHORT $LN6@test
$LN2@test:
; 11   :       case 4:j+=4;break;
    mov ecx, DWORD PTR _j$[ebp]
    add ecx, 4
    mov DWORD PTR _j$[ebp], ecx
    jmp SHORT $LN6@test
$LN1@test:
; 12   :       default:j+=10;
    mov edx, DWORD PTR _j$[ebp]
    add edx, 10                  ; 0000000aH
    mov DWORD PTR _j$[ebp], edx
$LN6@test:
; 13   :    }
......
$LN10@test:
    DD  $LN5@test          ;case 1
    DD  $LN4@test         ;case 2
    DD  $LN3@test         ;case 3
    DD  $LN2@test         ;case 4
        case           :
int test()
{
    int i,j;
    i=j=0;
   switch(i)
    {
       case 1:j+=1;break;
       case 2:j+=2;break;
       case 9:j+=3;break;
       case 15:j+=4;break;
       default:j+=10;
    }
    return 0;
}
             :
_test  PROC
; 2    : {
.....
; 5    : 
; 6    :    switch(i)
    mov ecx, DWORD PTR _i$[ebp]
    mov DWORD PTR tv64[ebp], ecx
    mov edx, DWORD PTR tv64[ebp]
    sub edx, 1
    mov DWORD PTR tv64[ebp], edx
    cmp DWORD PTR tv64[ebp], 14         ; 0000000eH
    ja  SHORT $LN1@test
    mov eax, DWORD PTR tv64[ebp]
    movzx  ecx, BYTE PTR $LN10@test[eax]
    jmp DWORD PTR $LN11@test[ecx*4]
             :
if(i-1>=14)
{
    goto $LN1@test ;//   switch   defaul  
}
else
{
    index = $LN10@test[i-1];//$LN10@test      
    goto $LN11@test[index];//$LN11@teest    
}
  ,  case                         ,   case            ,                  。
$LN5@test:
; 7    :    {
; 8    :       case 1:j+=1;break;
    mov edx, DWORD PTR _j$[ebp]
    add edx, 1
    mov DWORD PTR _j$[ebp], edx
    jmp SHORT $LN6@test
$LN4@test:
; 9    :       case 2:j+=2;break;
    mov eax, DWORD PTR _j$[ebp]
    add eax, 2
    mov DWORD PTR _j$[ebp], eax
    jmp SHORT $LN6@test
$LN3@test:
; 10   :       case 9:j+=3;break;
    mov ecx, DWORD PTR _j$[ebp]
    add ecx, 3
    mov DWORD PTR _j$[ebp], ecx
    jmp SHORT $LN6@test
$LN2@test:
; 11   :       case 15:j+=4;break;
    mov edx, DWORD PTR _j$[ebp]
    add edx, 4
    mov DWORD PTR _j$[ebp], edx
    jmp SHORT $LN6@test
$LN1@test:
; 12   :       default:j+=10;
    mov eax, DWORD PTR _j$[ebp]
    add eax, 10                  ; 0000000aH
    mov DWORD PTR _j$[ebp], eax
$LN6@test:
; 13   :    }
; 14   : 
; 15   :    return 0;
    xor eax, eax
; 16   : }
    mov esp, ebp
    pop ebp
    ret 0
$LN11@test:
    DD  $LN5@test
    DD  $LN4@test
    DD  $LN3@test
    DD  $LN2@test
    DD  $LN1@test
$LN10@test:
    DB  0
    DB  1
    DB  4
    DB  4
    DB  4
    DB  4
    DB  4
    DB  4
    DB  2
    DB  4
    DB  4
    DB  4
    DB  4
    DB  4
    DB  3
_test  ENDP
          case    :
int test()
{
    int i,j;
    i=j=0;
    switch(i)
    {
       case 1:j+=1;break;
       case 100:j+=2;break;
       case 250:j+=3;break;
       case 550:j+=4;break;
       default:j+=10;
    }
    return 0;
}
            :
; 5    : 
; 6    :    switch(i)
    mov ecx, DWORD PTR _i$[ebp]
    mov DWORD PTR tv64[ebp], ecx
;  250    $LN10@test, case 550    
    cmp DWORD PTR tv64[ebp], 250    ; 000000faH
    jg  SHORT $LN10@test
case 250
    cmp DWORD PTR tv64[ebp], 250    ; 000000faH
    je  SHORT $LN3@test
;case 1
    cmp DWORD PTR tv64[ebp], 1
    je  SHORT $LN5@test
;case 100
    cmp DWORD PTR tv64[ebp], 100    ; 00000064H
    je  SHORT $LN4@test
;       default    
    jmp SHORT $LN1@test
$LN10@test:
;case 550
    cmp DWORD PTR tv64[ebp], 550    ; 00000226H
    je  SHORT $LN2@test
;       default    
    jmp SHORT $LN1@test
$LN5@test:
  ,           !                 ,       。  ,                      。   ,                          ,                      ,         ,      ,               。

좋은 웹페이지 즐겨찾기