배열을 선언하고 그 안에 문자를 넣는 코드와

int형 변수 두개를 선언하여 출력하는 코드를 만든 뒤 릴리즈로 컴파일을 하자.





늘 하던대로 메인함수를 찾아서  F7을 눌러 들어간다.






스택프레임을 만드는 PUSHMOV가 등장했다.






ESP=EBP로 맞추어 놓았다가

ESP에 0x34를 빼주는데 이것은 스택에 0x34만큼 공간을 만들어준 것이다.





ESP와 EBP사이에 0x34의 공간이 생긴것을 볼 수 있다.

34는 10진수로 52이다.






밑에 이 명령어들은 변수들의 초기값을 지정해주는 명령어라 생각할 수 있다.

처음에 공간을 할당하고 EBP를 기준으로 주소를 빼면서 저장하는 것을 알 수 있따.






MOV EAX,DWORD PRT DS:[4020F4]

는 데이터 영역의 4020F4주소의 값 8바이트를 EAX에 MOV하라는 것이다.


그럼 4020F4에 내용에 뭐가있는지 직접 가본다.




이미 아스키코드로 데이터가 들어가 있다.

DWORD는 4바이트이므로 69 20 61 6D인 i am이 들어간다. 

그값이 EAX레지스터에 MOV 된다.


MOV DWORD PTR SS:[EBP-20],EAX

스택영역의 EBP-20(스택 마지막 부분에서 -20을 뺀 주소값)에 아까 가져온 i am을 넣어주는 명령어이다.

EAX에는 아까 가져온 데이터가 저장되어 있다.



이처럼 i am boy you are a girl! 을 다 가져와 스택에 넣으면 스택구조는 이처럼 변한다.


EDX의 반은 DX이고 DX의 반은 DL 이다

위에 나오는 DX는 EDX의 반의 영역이고

AL은 EAX의 반의 반 영역이다.








위를 보면 13,12를 해당 스택 주소값에 넣는 명령어가 나오는데 이것은 처음 코드에서 선언한 INT형 변수에 

19와 18를 넣어주는 명령어이다. 이 처럼 기계어에는 변수이름이 들어가지 않고 주소로 판단한다. 19와 18은 16진수로 

각각 13,12이다.

\

+ Recent posts