PintOS 2주차에 들어가기 전에 알아야 할 것을 정리해봄 (작성중)

Designated Hitter Jack·2023년 10월 4일
0

SW 사관학교 정글

목록 보기
23/44

레지스터 %rip 와 %rsp에 대하여

%rip

Instruction Pointer의 약자로, X64 architecture에서 명령어 레지스터이다.
즉, (64bit에서는) 이 레지스터가 Program Counter이다.
다음에 CPU에서 어떤 명령을 실행할지 가리키는 레지스터이며 크기는 8byte이다.
Instruction Pointer 인데 rip가 된 이유는 64bit 레지스터를 가리킬 때는 앞에 r을 붙이기 때문이다.
32bit는 보통 e를 붙인다.

%rsp

스택 포인터로 런타임 스택의 가장 끝 부분 (가장 최근에 push된 데이터)를 가리키기 위해 사용된다.
다시말해 사용중인 스택의 위치를 가리키는 포인터이다.

이 두 레지스터가 중요한 이유는 프로그램이 함수를 호출하는 과정에서 사용되기 때문이다.

  1. 함수 호출
    함수가 호출되면 현재 %rip의 값(다음 실행할 명령어의 주소)은 스택에 저장된다.
    %rsp가 스택의 최상단으로 이동하고, 새로운 스택 프레임이 생성된다.

  2. 함수 내부
    함수 내에서 지역 변수 및 함수의 인수와 같은 데이터가 스택에 저장된다.
    %rsp는 스택에 데이터가 푸시(push)될 때마다 감소하며, 팝(pop)될 때마다 증가한다.

  3. 함수 반환
    함수가 반환되면 스택에서 이전 %rip 값이 팝되어 복원되며, 프로그램은 이전 호출 지점으로 다시 이동한다.

function call

일반적인 함수 호출 과정

  1. 호출자(Calller) 함수가 호출되어야 할 함수의 이름 또는 주소를 찾는다.
  2. 호출자 함수는 호출할 함수에 필요한 인수를 준비하고, 호출할 함수의 인수 전달 규칙을 준수한다.
  3. 호출자 함수는 호출할 함수를 호출하기 위해 제어를 이동시킨다.

ret 명령어

  • 함수 내에서 call 명령어로 호출되는 함수는 새로운 스택 프레임을 생성하고,
    호출자 함수의 주소(리턴 주소)를 스택에 저장한다.
  • 이후, 호출된 함수는 명령을 실행하고,
    함수 실행이 완료되면 ret 명령어를 사용하여 제어를 호출자 함수로 다시 반환한다.

ret의 주요 역할

  • 호출된 함수는 ret 명령어를 실행하여 스택에서 이전 호출자 함수의 주소(리턴 주소)를 꺼내온다.
  • 이 주소로 제어를 전환하여 호출자 함수로 복귀한다.
  • 동시에 스택 프레임을 제거하고 이전 상태로 스택포인터(%rsp)를 복원한다.

스택과 함수 호출

  • 함수 호출과 ret 명령어는 주로 스택을 사용하여 관리된다. 스택은 함수 호출시 임시 데이터(인수, 지역변수 등등)와 호출 정보를 저장하는데 사용된다.
  • 호출된 함수가 스택에 새로운 스택프레임을 생성하고, ret 명령어를 통해 스택 프레임을 제거하는 과정을 call stack 이라고 부른다.

call stack에 대한 쉬운 설명

MDN 문서 - 호출 스택

세줄 요약

함수 호출(function call)은 프로그램에서 함수 간의 제어를 전환하는 중요한 메커니즘으로
1. 스택을 사용하여 호출 정보를 관리하며
2. ret 명령어를 통해 함수 호출을 완료하고 호출자로 제어를 반환한다.

profile
Fear always springs from ignorance.

0개의 댓글