시작하기 전에...
사외교육을 갔다가 너무 내용이 좋아서 정리하면서 글을 올리게 되었다. 교육내용을 모두 올린건 은 아니고 일부분을 재구성해서 올렸다.
강석민 강사님께 감사 드립니다^^
cafe.naver.com/cppmaster
반복문과 jmp
이번에는 간단한 반복문을 어셈코드로 짜보도록 하자..이를 통해 어셈의 제어문에 대해서 아주 간단하게나마 알 수 있을 것이다.
다음은 일반적인 C코드이다 무엇을 하는지는 쉽게 알 수 있을 것이다.
int func(int start, int end)
{
int i;
for( I = start; I < end; I++);
return i;
}
void main()
{
printf("%d\n", func(1, 10) );
}
위의 코드에서 func함수를 어셈코드로 작성해보도록 하자.
segment.text
global _asm_main
_asm_main:
push ebp
mov ebp, esp
moveebx, [ebp+8]
moveecx, [ebp+12]
my_loop:
cmpecx, ebx
jereturn
addebx, 1
jmpmy_loop
return:
moveax, ebx
movesp, ebp
popebp
ret
이렇게 작성을 한다면 똑같은 일을 하는 함수가 만들어 진다.
먼저 cmp명령어를 보자. 두 값을을 비교하라는 명령어인데 결과 값은 eflags레지스터의 특정 비트에 저장된다. 자세한 것은 다음에 설명을 하겠다. 아무튼 그결과를 알기 위해 je라는 명령어를 통해 확인한다. je는 만약 비교한 결과가 같다면 특정 주소로 점프하라는 명령어이다. jz, jnz등 이런류의 명령어는 굉장히 많으므로 필요시 레퍼런스를 참고 하면 될 것이다. 제어문은 C와 크게 다르지 않기 때문에 차근차근 생각해본다면 크게 어렵지는 않기 때문에 간략히 설명해야 겠다.z