
🏷️x86 Stack Segement
- RISC-V에서는 프로시저 중간에 SP(Stack Pointer)가 바뀌는 경우 FP(=BP, Frame Pointer)를 x8 레지스터에 저장하여 사용한다.
- 이 때 FP는 Procedure Frame의 첫 번째 item을 가리키게 된다.
- 즉, x86에서는 Frame의 한 가운데를 가리키지만, RISC-V에서는 BP(Base Pointer)의 본래 의미답게 Procedure Frame의 Base Address를 가리킨다.

- 함수 호출 시 일어나는 과정에 대해 알아보자. 그 전에 스택은 높은 주소에서 낮은 주소 방향으로 할당된다는 것을 기억하자.
- SP는 현재 Top of Stack을 가리키고 있다.
- 함수를 호출하려면 매개변수를 역순으로 Stack에 Push해야 한다.
- 함수를 호출한다.
- 함수를 호출하면 복귀 주소(Ret address)가 Stack Push된다.
- 함수 내부에선 보통 함수 호출 전 BP(Previous Base Pointer)값을 저장하기 위해 Stack에 Push한다.
- 이 때의 SP는 Previous BP를 가리키고 있다.
- 편하게 스택을 이용하기 위해 BP는 현재 SP의 값으로 설정된다.
- Loacl Variable이 스택에 할당된다.
- 이 때 BP는 Stack Frame의 한 가운데를 가리키게 된다.
- 이 것이 BP가 Frame Pointer라고도 불리는 이유다.
- BP를 기준으로
-
(Negative)방향, +
(Positive)방향으로 접근하면 된다.
- 🖇️cf)
-
는 Local Variable 접근, +
는 Parameter 접근
- 함수가 종료되기 전
pop BP
명령을 통해 Previous BP를 복구한다.
ret
명령을 만나면 복귀주소를 스택에서 pop시키고 pc(program counter)에 load한다.
- 이 때
ret 8
의 형식으로 SP값을 변경시켜서 스택을 정리해주면 __stdcall방식이고, ret
만 하고 스택을 정리해주지 않는 경우 __cdecl방식이다.
- 🖇️cf. SP(Stack Pointer)는 Push/Pop에 의해 계속 변하지만, BP는 함수 호출이 일어나는 동안 값이 변하지 않는다.
