본문 바로가기
코스웨어/13년 스마트컨트롤러

switch 문 분석하기

by 알 수 없는 사용자 2013. 9. 4.
728x90
반응형

우선 분석하기 위한 기본 소스는 아래와 같습니다.


#include <stdio.h>


int main()

{

int a = 1;


switch( a )

{

case 0:

a++;

break;

case 1:

a--;

break;

case 3:

a = 0;

default:

a = 100;

break;

}


return 0;

}


보시는 바와 같이, int형 변수 a에 초기값을 1로 지정하였고, switch문으로 a의 값에 따라 case문에 들어가도록 되어 있습니다.

그리고 case 3을 제외한 모든 경우에 break;를 끝에 넣어주었습니다.


switch( a )

004117C5  mov         eax,dword ptr [a]  

004117C8  mov         dword ptr [ebp-0D0h],eax  

004117CE  cmp         dword ptr [ebp-0D0h],0  

004117D5  je          main+4Bh (4117EBh)  

004117D7  cmp         dword ptr [ebp-0D0h],1  

004117DE  je          main+56h (4117F6h)  

004117E0  cmp         dword ptr [ebp-0D0h],3  

004117E7  je          main+61h (411801h)  

004117E9  jmp         main+68h (411808h)  

{

case 0:

a++;

004117EB  mov         eax,dword ptr [a]  

004117EE  add         eax,1  

004117F1  mov         dword ptr [a],eax  

break;

004117F4  jmp         main+6Fh (41180Fh)  

case 1:

a--;

004117F6  mov         eax,dword ptr [a]  

004117F9  sub         eax,1  

004117FC  mov         dword ptr [a],eax  

break;

004117FF  jmp         main+6Fh (41180Fh)  

case 3:

a = 0;

00411801  mov         dword ptr [a],0  

default:

a = 100;

00411808  mov         dword ptr [a],64h  

break;

}


!?!?!?!?!?!?


다소 복잡한 구조를 띄고 있습니다.

우선 switch문에서는 if문과 같이 값을 비교하여 해당 위치에 맞게 점프해주는 역할을 하는 걸로 보입니다.

케이스 문이 아래에 있을 수록 비교하는 데에 오래걸리겠군요. if 문도 순서에 신경을 써야 하는데 switch문도 순서에 다소 신경을 써야할 것 같아요.


break문은 if문 분석에서 예상했던 바와 같이 switch문을 아예 벗어나는 역할을 담당하고 있습니다.

break문이 없는 case 3:의 경우 해당 점프 문이 아예 없는 것을 볼 수 있습니다.


if문과의 차이점은 if문은 명령어가 시작되는 곳 전으로 점프하여 그곳에서 비교하고 틀리면 점프를 반복하는 반면에,

switch문은 처음부터 모든 경우를 비교하여 점프하는 방식이라는 점과

if문이 해당 조건을 완수하면 다른 조건이 실행되기 전에 밖으로 자동으로 점프하게 해주지만 switch문은 수동으로 점프(break)명령을 넣어주어야 한다는 점인 것 같습니다.

728x90