컴퓨터구조_레지스터

전우영·2024년 10월 2일
0

레지스터의 x, t, s와 같은 표기법은 CPU의 아키텍처에서 중요한 개념으로, 주로 RISC-V 같은 명령어 집합 아키텍처에서 많이 사용됩니다. 각각의 레지스터는 특정 용도로 사용되며, 어떤 값을 저장하거나 함수 호출, 프로시저 실행 중에 데이터를 처리하는 데 중요한 역할을 합니다.

RISC-V에서 레지스터는 x0 ~ x31처럼 이름이 붙어 있는데, 이들을 다른 용도에 맞게 세분화하여 t (temporary), s (saved) 등의 이름으로 구분합니다. 여기서 각 레지스터가 어떤 역할을 하는지 더 자세히 살펴볼게요.

1. x0 ~ x31 (기본 레지스터들)

RISC-V의 기본 레지스터들은 x0 ~ x31으로, 총 32개의 64비트 또는 32비트 레지스터가 있습니다. 각 레지스터는 다양한 작업을 지원하며, 보통 다음과 같은 용도로 분류됩니다:

  • x0: 항상 값이 0인 레지스터로, 상수 0을 필요로 할 때 사용합니다. 이 레지스터는 변경이 불가능합니다.
  • x1 ~ x31: 나머지 레지스터들은 특정 용도에 따라 구분됩니다. 이들을 구분하는 기준이 바로 t (temporary), s (saved), a (argument) 같은 레지스터 네이밍 규칙입니다.

2. 임시 레지스터 (Temporary Registers, t0 ~ t6)

  • t0 ~ t6: 이 레지스터들은 일시적인 값들을 저장하기 위해 사용됩니다. 임시 레지스터는 함수 호출이나 프로시저 중에 사용되며, 값이 계속 유지될 필요가 없기 때문에 자유롭게 덮어씌울 수 있습니다.
    • 임시값을 저장하는 용도로 쓰이며, 함수 간 값을 공유하지 않아도 됩니다.
    • 함수 호출 후에 이 값들이 덮어씌워져도 문제가 없기 때문에 함수 내부에서 주로 연산의 중간 값을 처리할 때 사용됩니다.

예시:

add t0, t1, t2   # t1과 t2를 더해서 결과를 t0에 저장

위 명령어에서는 두 값을 더한 결과를 t0에 저장하지만, 이 값은 나중에 다른 연산에 의해 덮어씌워질 수 있습니다.

3. 저장 레지스터 (Saved Registers, s0 ~ s11)

  • s0 ~ s11: 이 레지스터들은 함수가 실행된 후에도 값이 유지되어야 하는 경우에 사용됩니다. 저장 레지스터는 보통 함수를 호출하는 쪽(Caller)이 아닌, 호출된 함수(Callee)가 값을 보존해야 할 때 사용됩니다.
    • 함수가 실행되는 동안 s 레지스터의 값은 변경될 수 있지만, 함수가 종료되면 원래의 값으로 복원되어야 합니다.
    • 이를 위해 호출된 함수는 s 레지스터의 기존 값을 스택에 저장해 두었다가, 함수가 끝난 후 복구하는 작업을 합니다.

예시:

addi s0, s0, 1   # s0에 1을 더한다. 함수가 끝난 후에는 원래 값으로 복구되어야 함.

4. 인자 레지스터 (Argument Registers, a0 ~ a7)

  • a0 ~ a7: 이 레지스터들은 함수에 전달할 인자(argument)를 저장하는 용도로 사용됩니다. 함수 호출 시 전달되는 인자들은 일반적으로 a0 ~ a7 레지스터에 저장됩니다. 함수가 실행될 때 이 레지스터들에 들어 있는 값이 함수에 인자로 전달됩니다.
    • 또한 함수가 실행된 후 반환값(return value)도 a0에 저장됩니다.

예시:

addi a0, a1, 5   # a1에 5를 더한 값을 a0에 저장 (a0은 첫 번째 인자를 의미)

5. 특수 용도의 레지스터

  • x1 (ra - Return Address 레지스터): 함수 호출 후 되돌아갈 주소를 저장하는 레지스터입니다. 프로시저 호출이 끝나면 ra 레지스터(x1)에 저장된 주소로 다시 복귀합니다.
  • x2 (sp - Stack Pointer 레지스터): 스택의 현재 위치를 가리키는 레지스터입니다. 함수 호출 시 지역 변수나 리턴 주소 등을 저장하는 스택의 최상단을 가리킵니다.
  • x3 (gp - Global Pointer 레지스터): 전역 변수를 가리키는 데 사용됩니다.
  • x4 (tp - Thread Pointer 레지스터): 스레드별 데이터를 저장하는 포인터로 사용됩니다.

6. 스택과 레지스터

프로시저나 함수 호출 시, 저장 레지스터(s0 ~ s11)임시 레지스터(t0 ~ t6)의 차이는 함수 호출 시 값이 어떻게 처리되느냐에 달려 있습니다. 저장 레지스터는 함수가 값을 보존해야 하지만, 임시 레지스터는 함수 호출이 끝나면 그 값을 보존할 필요가 없습니다.

  • 스택: 함수 호출 중에 필요한 데이터를 저장하기 위해 사용됩니다. sp 레지스터는 스택의 위치를 추적합니다.

요약

  • x0 ~ x31: RISC-V 아키텍처에서의 기본 레지스터들.
  • t0 ~ t6: 임시 레지스터. 연산 중 일시적인 값을 저장하며, 함수 호출 후 값을 유지할 필요가 없습니다.
  • s0 ~ s11: 저장 레지스터. 함수가 끝난 후에도 값을 유지해야 하는 경우에 사용됩니다.
  • a0 ~ a7: 인자 레지스터. 함수 호출 시 인자를 전달하거나 리턴값을 저장하는 데 사용됩니다.
  • ra(x1), sp(x2), gp(x3) 등은 함수 호출과 스택 관리 등 특정 용도로 사용됩니다.

이러한 레지스터는 함수 호출, 연산, 데이터 저장에 필수적인 역할을 하며, CPU가 효율적으로 작동하게 만드는 핵심 요소들입니다.

https://velog.io/@shdbtjd8/%EC%BB%B4%ED%93%A8%ED%84%B0%EA%B5%AC%EC%A1%B0-Procedure

profile
신입개발자지원자희망자

0개의 댓글