작성
·
248
2
함수 영역 스택 프레임이 [매개변수][RET][지역변수] 이렇게 세팅 되어 있다고 알려주셨는데요!
다음 함수를 호출 할 때 매개변수 값만 넘겨주는 것이지 매개변수 주소와 주소 반환 값 주소는 여전히 이전 함수에서 스택 프레임 영역에 있고 다음 함수는 다시 스택 프레임 영역을 지정하고 지역변수 주소는 온전히 자기 영역에서 관리하는 것이라고 이해하는 것이 맞을까요?
그리고 넘어온 매개변수 값을 사용할 때 해당 함수 지역변수로 봐야 할까요?
그리고 다음 함수에서 스택 프레임 영역을 지정할 때 왜 이전 함수 베이스 포인터 주소를 저장하는지도 궁금합니다.
답변 1
1
다음 함수를 호출 할 때 매개변수 값만 넘겨주는 것이지 매개변수 주소와 주소 반환 값 주소는 여전히 이전 함수에서 스택 프레임 영역에 있고 다음 함수는 다시 스택 프레임 영역을 지정하고 지역변수 주소는 온전히 자기 영역에서 관리하는 것이라고 이해하는 것이 맞을까요?
네 기본적으로 그렇지만. 매개변수가 포인터or참조 타입이라면 주소를 넘겨줄 것이고, 그 주소는 이전 스택 프레임의 주소겠죠.
그리고 넘어온 매개변수 값을 사용할 때 해당 함수 지역변수로 봐야 할까요?
뭐 그건 관점의 차이지만 크게 중요하진 않습니다. (약간 이전/현재 함수의 중간에 있는 공간이랄까요?)
어차피 사용하는 쪽은 호출된 함수긴 하겠죠.
그리고 다음 함수에서 스택 프레임 영역을 지정할 때 왜 이전 함수 베이스 포인터 주소를 저장하는지도 궁금합니다.
BP는 배에 비유하면 닻 같은 존재입니다. 지역 변수를 접근할 때는 절대 주소가 아니라 BP를 기준으로 하는 상대 주소로 접근하게 코드가 만들어지는데요 (ex. ebp+16번지에 1이라는 값을 대입해라!) 문제는 특정 함수에서 다른 함수를 호출하면, 새로운 스택 프레임이 만들어지면서 그 기준이 바뀌기 때문에 BP 레지스터가 새로운 기준 위치로 갱신됩니다. 함수 호출이 완료되면, 이전 함수로 돌아가야 하는데 '이전 함수의 기준이 되는 BP 주소'를 기억하고 있어야 복원이 가능합니다. 그래서 함수 호출이 완료될 때는 대부분 pop ebp 같이 bp 레지스터에 어떤 주소를 복원하는 코드가 꼭 들어갑니다.
답변 감사합니다! 해당 질문을 받고 궁금한 부분이 또 생겼는데요! 함수 호출이 완료되면 다음 코드를 실행하기 위해 주소 반환 값 주소를 이전 함수 스택 프레임에 저장하여 이전 함수로 돌아가 다음 코드를 실행하는 걸로 알고 있습니다! 그럼에도 '이전 함수의 기준의 되는 BP 주소' 를 꼭 기억해야만 복원이 가능한건가요?