ISA와 어셈블리

RISC-V 호출 규약에서 s0~s11이 '호출 대상 저장(callee-saved)' 레지스터라는 의미로 올바른 것은?

  1. A호출된 함수가 이들을 사용한다면 원래 값을 저장해 두었다가 복귀하기 전에 되돌려 놓는다
  2. B호출하는 쪽 함수가 호출 전에 반드시 모두 0으로 만들어 둔다
  3. COS만 사용할 수 있는 레지스터이며 사용자 프로그램은 사용할 수 없다
정답과 해설 보기

정답: A. 호출된 함수가 이들을 사용한다면 원래 값을 저장해 두었다가 복귀하기 전에 되돌려 놓는다

호출 대상 저장 레지스터는 함수 호출을 거쳐도 값이 유지됨이 약속되어 있습니다. 호출된 함수가 s0 등을 사용하고 싶을 때는 처음에 스택에 저장하고 복귀하기 전에 원래대로 되돌립니다. 호출하는 쪽은 함수를 호출한 뒤에도 계속 쓰고 싶은 값을 s 계열 레지스터에 두면 스스로 다시 저장할 필요가 없습니다. 루프 변수 등이 흔히 여기에 놓입니다.

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

ISA와 어셈블리의 다른 문제

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