• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

ret과 sp, bp, ip 의 관계/흐름 질문

21.05.11 18:01 작성 조회수 387

0

MAX함수에서 L1 블록에서

ret을 실행하면 CALL을 실행한 주소로 돌아가는데

그 원리가 다음과 같이 진행되는 것으로 이해되는지 궁금해서 질문드립니다.

-----------------------------------------------------

우선 CALL MAX에 의해 현재 ip의 값이 stack에 push 됩니다. 즉, ret 값이 들어갑니다
그리고 ip에는 MAX 함수의 주소값이 저장되어 다음부터는 MAX 함수가 실행됩니다.

함수 마지막 부분 "pop rbp"에 의해 rbp에는 CMAIN의 base pointer(주소값)가 저장되고,
sp는 코드상 위쪽 "CALL MAX"를 하면서 
next instruction(CALL MAX 다음 줄)의 주소값이 저장된 스택의 주소값을 가리킵니다
(즉, 코드영역의 "PRINT_DEC 8, rax" 부분의 주소값
= ret을 가리킵니다)

이때 ret 명령어는 pop ip 를 실행함으로써 ip에는 다시 ret가 들어가게 되고, 
결국 다음에는 PRINT_DEC 8, rax 이 실행됩니다.

그리고 이제 sp는 2가 들어있는 스택의 주소값을 가리키고 있으므로 
복원이 필요합니다.
16을 더해 이전에 push 했던 rbx의 값을 가리키게 하고
두 번 pop 함으로써 sp가 다시 스택의 시작점을
가리키게 함으로써 함수 실행이 완료됩니다.

마지막에 CMAIN의 ret는 다시  stack을 pop ip 하는데,
이때 ip는 스택의 시작점을 가리키는 주소값이 저장되므로
프로세스가 종료됐음을 알 수 있습니다.

따라서 프로세스가 종료됩니다.

-----------------------------------------------------

이런 흐름으로 이해했는데, 혹시 잘못 이해하고 있는 부분이 있을까요?

답변 4

·

답변을 작성해보세요.

1

잘 이해하신 것 같습니다.
CALL XX은 사실상 push eip와 jump XX이 합쳐진 형태라고 보시면 됩니다.

그리고
나중에 C++ 함수 스택 프레임에 대해서 다룰 때
스택 메모리를 까보는 실습을 하기 때문에
그 때 다시 정밀하게 살펴보게 될테니
너무 초반에 힘 빼지 마시고 넘어가셔도 괜찮습니다.
오히려 말로 하면 더 헷갈리는 것 같네요 ㅎㅎㅎ

1

네 전체적인 흐름은 맞습니다. 디테일하게 설명을 붙이자면.

- sp(stack pointer)는 현재 스택 포인터 (다음에 push를 할 위치)를 의미하고,
코드가 실행될 다음 주소랑은 '직접적인' 연관은 없습니다.
- 다음 실행될 코드의 주소는 ip(instruction pointer)쪽에 들어가 있습니다.

따라서..

이때 ret 명령어는 Program Counter가 sp가 가리키는 주소를 실행하게 함으로써

느낌적으로는 맞는데 정확하게 말하자면
ret 명령어는 [현재 sp가 가리키는 위치에 있는 주소를 ip 레지스터에 복원]하는 기능을 합니다.
현재 A위치에 [call MAX 다음에 실행되어야 할 코드 주소]가 스택에 들어가 있으니

결과적으로 함수 호출이 완료되면 ip가 함수 호출 다음 코드로 복원되어
함수 호출 후에 이어서 실행할 주소가 자연스럽게 실행되겠죠.

16을 더해 이전에 push 했던 rbx의 값을 가리키게 하고
두 번 pop 함으로써 sp가 다시 스택의 시작점을
가리키게 함으로써 함수 실행이 완료됩니다.

인자로 push 5, push 2를 두 번 해줬으니
16바이트를 다시 더해줘서 스택을 쥐도 새도 모르게 원상태로 복구하는 것입니다.
하지만 꼭 함수 호출이 완료된 다음에 해야 하는 것은 아니고,
함수의 호출 규약에 따라 스택 정리를 함수 내부에서 할 수도 있습니다.

0

Oh Seo님의 프로필

Oh Seo

질문자

2021.05.11

넵넵 감사합니다! ㅎㅎ

0

Oh Seo님의 프로필

Oh Seo

질문자

2021.05.11

감사합니다! ip 내용 관련해서 질문을 다시 수정해봤는데,
아직 조금 헷갈리는 부분은

call MAX 를 할 때 다음 실행될 코드가 MAX 함수 부분인데
call 을 수행할 때 ip의 값은 어떻게 변하는지에 대한 부분입니다.


혹시 수정된 질문과 이 부분에 대해 더 설명해주실 수 있으신가요?