미해결
[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문
ret과 sp, bp, ip 의 관계/흐름 질문
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는 스택의 시작점을 가리키는 주소값이 저장되므로프로세스가 종료됐음을 알 수 있습니다.
따라서 프로세스가 종료됩니다.-----------------------------------------------------
이런 흐름으로 이해했는데, 혹시 잘못 이해하고 있는 부분이 있을까요?