ENTER numbytes, nestinglevel

numbytes 는 변수로 사용하고자 하는 바이트 수치
nestinglevel 은 { 를 중첩해서 써 내려갈 때의 중첩 수치


Enter명령은 nestingLevel 이 0 일때 아래처럼 매칭이 되는데


일반적 방법

ENTER 명령어 사용

push ebp

mov ebp,esp

sub esp,4

enter 4,0


nestingLevel 에 수치가 주어 지게 되면 이전 , 이전전... ebp 들을 저장하여 이전에 사용했던 변수들에 접근 하도록허용해준다

enter 로 들어 가서 할당한다음 leave 로 할당한 메모리를 해제 하는 처리를 해야함


if 먼저 아래처럼 asm 코드를 작성 한다고 했을 때


_asm {


enter 4, 0 0)

enter 4, 1 1)


enter 4, 2 2)


enter 4, 3 3)


enter 4, 4 4)


enter 4, 5 5)


}




먼저 아래처럼 asm 코드를 작성 한다고 했을 때 아래 처럼 실제 메모리 주소에 이전 ebp 값들이 어떻게 쌓이는지 확인 할 수가 있으며 이 값들로 한 함수 내에서 아래와 같은 괄호로 묶은 지역 변수들을 참조 할 수 있는 형태를 구성 할 수 있다


void stackFrameTestFunc()

{

int a=0;

{

int b=0;

{

int c=0;

a=3;

b=4;

}

}

}



}


먼저 이전 스택영역으로 되돌아 가기전에 enter 명령어가 수행 되면 push ebp 가

기본 수행 된 다음 이전 ebp 를 넣는 처리를 하게 된다



왼쪽 굵은 글자 0x00000000 는 실제 메모리 주소를 말한다

오른쪽 주소는 해당 메모리 주소에 들어가있는 값


 

5)

0X0078F794

0X0078F798  0078F7AC   //현재 ebp

0X0078F79C  0078F7C4 //이전 ebp

0X0078F7A0  0078F7D8 //이전전 ebp

0X0078F7A4  0078F7E8 //이전전전 ebp

0X0078F7A8  0078F7F4   //이전전전전 ebp

0X0078F7AC  0078F7C4   //이전 ebp                        enter 4, 5 5)

4)

0X0078F7B0  

0X0078F7B4  0078F7C4 //현재 ebp

0X0078F7B8  0078F7D8 //이전 ebp

0X0078F7BC  0078F7E8 //이전전 ebp

0X0078F7C0  0078F7F4 //이전전전 ebp

0X0078F7C4  0078F7D8 //이전 ebp                        enter 4, 4 4)


3)

0X0078F7C8

0X0078F7CC  0078F7D8 //현재 ebp

0X0078F7D0  0078F7E8 //이전 ebp

0X0078F7D4  0078F7F4 //이전전 ebp

0X0078F7D8  0078F7E8 //이전 ebp                        enter 4, 3 3)

2)

0X0078F7DC

0X0078F7E0  0078F7E8 //현재 ebp

0X0078F7E4  0078F7F4 //이전 ebp

0X0078F7E8  0078F7F4 //이전 ebp                        enter 4, 2 2)

1)

0X0078F7EC

0X0078F7F0  0078F7F4 //현재 ebp

0X0078F7F4  0078F7FC   //이전 ebp                        enter 4, 1 1)


0)

0X0078F7F8  

0X0078F7FC  0078F8CC //이전 ebp                        enter 4, 0 0)

 










반응형

+ Recent posts