본문으로 바로가기

해커스쿨.Section 17

category Study/system 2017. 11. 7. 01:46


Section 17


스택에 저장되는 값들 살펴보기





변수가 스택에 어떻게 저장되는지 살펴보기 위해 아래와 같은 코드를 살펴보자



a -> b -> c-> d 순서로 변수를 선언했기 때문에 a부터 스택에 쌓일것이다.


아래 결과를 살펴보자



예상했던 대로 가장 먼저 선언한 a의 값인 1이 가장 높은 주소에 저장되어있는 것을 확인할 수 있다.





이번에는 int형이 아닌 자료형이 선언될 때 어떻게 선언되는지 살펴보자


우선 1바이트의 크기를 가진 char형을 선언한 코드는 아래와 같다.



결과를 보면 4바이트 할당되어있고, 7이란 값이 들어가 있기는 하다


그러나 07 앞에있는 eb 83 04는 무엇일까?


우리가 프로그래밍을 하다보면 초기화를 안하고 사용하는 경우가 있다


이러한 변수에 값을 넣지 않은채로 출력하게 되면 이상한 값이 나오게 된다


이것을 쓰레기 값이라고 불렀는데 위와 같은 데이터이다


기존에 해당 주소를 사용했던 흔적이 남아있는 것이다




이번에는 2바이트 크기를 가진 short형을 살펴보자



이번에도 쓰레기값 2바이트와 함께 7이란 값이 들어가 있는 것을 확인할 수 있다.




어느정도 변수의 선언이 스택에 어떤 모습으로 표현되는지 알아보았으니 함수에 대해서 알아보자


이전에 사용자 정의 함수를 호출할 때 스택에 리턴어드레스와 SFP가 저장됨을 알 수 있었다.


기억을 되새기며 아래 코드를 살펴보자



위의 경우 a에서 d 순서로 스택에 먼저 쌓이며 넘겨준 인자는 뒤에서부터 쌓인다.


인자가 스택에 push 되었으면 리턴어드레스(ret)와 SFP가 쌓이고 함수 내의 변수인 a와 b역시 a부터 쌓인다.



그 결과를 이미지화 하면 아래와 같다.



예상했던 순서대로 스택에 데이터가 들어간 것을 확인할 수 있다.


여기서 한가지 규칙을 찾을 수 있는데


인자 -> RET -> SFP -> 함수 내 데이터를 하나로 묶을 수 있다는 점이다.


이렇게 형성되는 하나의 묶음을 스택프레임이라고 한다.



'Study > system' 카테고리의 다른 글

해커스쿨.Section 20  (0) 2017.11.07
해커스쿨.Section 19  (0) 2017.11.07
해커스쿨.Section 15  (0) 2017.11.07
해커스쿨.Section 14  (0) 2017.11.05
해커스쿨.Section 12  (0) 2017.11.02