x86 Stack Segement

MySprtlty·2023년 4월 27일
0

x86

목록 보기
1/1
post-thumbnail

🏷️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를 가리킨다.

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

0개의 댓글