헷갈려서 정리해본다.
push rbp 를 하게 되면 rsp 가 -0x8 이 되고 메모리에 rbp 값이 들어간다.
pop rbp 를 하게 되면 rsp 메모리 값이 rbp 에 저장되고 rsp 가 +0x8 이 된다.
함수 프롤로그
얼마나 사용할껀지 정해놓고 시작한다. 아래는 초기값 이다.
push rbp 한 결과다. ( rsp 가 -0x8 이 되고 메모리에 rbp 값이 들어간다 )
mov rbp, rsp 한 결과다.
sub rsp, 0x90 한 결과다.
main 함수 프롤로그는 0x90 만큼 스택을 확보하고 시작하는걸 알 수 있다.
함수 에필로그
leave 연산자는 mov rsp, rbp; pop rbp 를 수행한다. 아래는 초기값 이다.
leave 한 결과다.
step1. mov rsp, rbp
step2. pop rbp ( rsp 메모리 값이 rbp 에 저장되고 rsp 가 +0x8 이 된다 )
ret 한 결과다. (pop rip)
1. rip : 0x7ffff7c2a1ca (rsp : 0x7fffffffe2c8 → 0x7ffff7c2a1ca)
2. rsp : 0x7fffffffe2d0 (rsp : rsp(0x7fffffffe2c8) + 0x8)
결론
함수 프롤로그 전 rbp : 0x7fffffffe360
함수 에필로그 후 rbp : 0x7fffffffe360
서로 동일하다.