1-0

어셈블리 공부할 때 나왔었던 스택 메모리에 관해 다시 한번 복습해보려고 한다.

 

함수가 호출되면 각 함수는 스택이라는 저장 공간에 [매개변수] [RET] [지역변수] 공간을 할당받는다.

함수 내에서 다시 함수가 호출되면 위에 이미지처럼 높은 주소에서 낮은 주소 순서로 공간을 할당받는다.

이 할당된 공간들은 함수가 종료되면 사라진다. 중요한 개념이니 잘 기억해두자.


2-0

코드가 위와 같을 때 첫 번째 hp와 두 번째 hp는 각각 어떤 값이 출력될까?

 

2-1

정답은 1, 1이 출력된다.

그 이유는 무엇일까? 분명 코드에서는 출력문 사이에 함수를 호출해서 hp + 1을 해줬으니 

2가 출력돼야 하는 게 정상 아닐까?

 

이렇게 출력되는 이유는 이미 맨 위에 적어놨었다. 

즉, 함수가 호출되고 저장되는 공간이 다르다는 것이 중요한 포인트이다.

 

우선 main 함수에서 int hp 명령을 이용해 '지역 변수'를 선언한다. 

지역 변수는 main 함수가 할당된 스택 저장 공간에서 지역 변수 부분에 저장된다.

 

그리고 출력문 하나를 출력하고 a라는 함수가 호출된다. a라는 함수는 매개 값으로 hp(==1)를 할당받는다.

a라는 함수가 호출되었으니 a 함수 쪽으로 시선을 돌리면 int hp라는 명령을 이용해 '매개 변수'를 선언한다.

매개 변수는 a 함수가 할당된 스택 저장 공간에서 매개 변수 부분에 저장된다.

 

즉, 두 변수는 전혀 다른 공간에 저장된 다른 변수이다.

a 함수 내에서 hp = hp + 1이라는 명령은 매개 변수로써 선언된 hp 변수의 값을 변경시키는 것이지

main 함수 내에 있는 지역 변수 hp를 변경시키는 것이 아니다.

 

또한 중요한 것이 해당 함수에 할당된 저장 공간은 해당 함수가 종료되면 그대로 사라진다.

즉, a 함수 내에서 지역 변수를 선언하거나 매개 변수를 이용해 값을 변경하더라도

a 함수가 호출이 끝나면 저장 공간에서 사라진다는 것이다.

 

그렇기 때문에 main 함수 내에 지역 변수 hp는 어떠한 변경점도 없이 그대로 두 번 출력되는 것이다.


아래 내용은 스택 프레임과 관련이 없고 필자의 궁금증에 의해 실험해보았다.

이미지 2-0 코드에서 a 함수가 값을 출력하기 위해 void를 삭제하고 int를 넣어주었다.

그리고 리턴 값을 매개 변수 hp로 설정해주었다.

 

지금까지 설명했듯이 함수가 종료되면 해당 함수에 할당된 저장 공간들도 사라지기 때문에 

매개 변수 hp는 사라질 것이다. 하지만 리턴을 해주게 되면 어떻게 될지 궁금해서 실험해보았지만 

결괏값에 변화는 없었다. 그럼 리턴 값은 어디로 간 것일까?

 

이번에는 a 함수 호출을 출력문 사이가 아닌 마지막 출력문에 직접적으로 넣어봤다.

이번에는 원하던 값이 출력되는 것을 확인했다.

즉, a 함수의 리턴값 hp는 a 함수가 호출된 라인에서만 살아있고 함수 호출이 종료되는 다음 라인에서는

저장 공간이 사라지듯이 리턴 값도 사라진다.

+ Recent posts