우선 분석하기 위한 기본 소스는 아래와 같습니다.
#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)명령을 넣어주어야 한다는 점인 것 같습니다.
'코스웨어 > 13년 스마트컨트롤러' 카테고리의 다른 글
2013.09.04_jmp instruction 과제_ 김성엽 (0) | 2013.09.04 |
---|---|
2013년 9월4일 <conditional jump> (0) | 2013.09.04 |
9월3일 어셈블리(숙제) (0) | 2013.09.04 |
어셈블리어 과제 (Conditional Jump) (0) | 2013.09.04 |
어셈블리 숙제 조유진 (0) | 2013.09.04 |
9월 4일 어셈블리 숙제 (0) | 2013.09.04 |
jns와 jnz 소스분석 - 문예진 (1) | 2013.09.04 |
9월2일자 ASM 숙제 (0) | 2013.09.04 |