ISA와 어셈블리

RISC-V 호출 규약에서 t0~t6은 '호출 원본 저장(caller-saved)' 레지스터이다. 어떤 함수가 t0에 넣은 값을 다른 함수를 호출한 뒤에도 사용하고 싶을 때 올바른 대응은?

  1. A아무것도 하지 않아도 호출된 함수가 t0를 반드시 원래대로 되돌려 준다
  2. Bt0는 다른 함수에서 고쳐 쓸 수 없으므로 그대로 사용할 수 있다
  3. C호출 전에 t0의 값을 스택 등에 대피시키고 호출한 뒤에 되돌린다
정답과 해설 보기

정답: C. 호출 전에 t0의 값을 스택 등에 대피시키고 호출한 뒤에 되돌린다

t 계열 레지스터는 호출된 함수가 저장하지 않고 자유롭게 사용해도 되도록 되어 있습니다. 그래서 호출한 뒤에도 값이 필요하다면 호출하는 쪽이 스스로 대피시켜 두어야 합니다. 저장 책임을 호출하는 쪽과 호출받는 쪽으로 레지스터별로 나눠 두면, 많은 함수는 저장 수고 없이 임시용 레지스터를 사용할 수 있고 전체 저장과 복원 횟수를 줄일 수 있습니다.

이 분야 연습하기 분야로 돌아가기

ISA와 어셈블리의 다른 문제

  1. 다른 함수를 호출하지 않는 함수(리프 함수)에서는 ra를 스택에 저장하지 않아도 되는 경우가 많다. 그 이유로 올바른 것은?
  2. RISC-V 함수의 시작 부분에서 'addi sp, sp, -16'을 실행하는 목적으로 올바른 것은?
  3. RISC-V의 표준 호출 규약에서는 함수에 진입할 때의 스택 포인터 sp를 16바이트의 배수로 맞추게 되어 있다. 그 이유로 가장 적절한 것은?
  4. 위의 코드는 어떤 함수의 시작 부분(프롤로그)이다. 이 부분이 하고 있는 일로 올바른 것은?
  5. 함수 안에서 프레임 포인터(RISC-V에서는 s0/fp)를 사용하는 이점으로 올바른 것은?