ISA와 어셈블리

다른 함수를 호출하지 않는 함수(리프 함수)에서는 ra를 스택에 저장하지 않아도 되는 경우가 많다. 그 이유로 올바른 것은?

  1. A리프 함수에서는 ret 명령어를 사용하지 않기 때문
  2. B리프 함수의 복귀 주소는 CPU가 자동으로 스택에 쌓기 때문
  3. C다른 함수를 호출하지 않으므로 ra가 덮어써지지 않아 복귀 주소가 그대로 남아 있기 때문
정답과 해설 보기

정답: C. 다른 함수를 호출하지 않으므로 ra가 덮어써지지 않아 복귀 주소가 그대로 남아 있기 때문

ra는 함수를 호출하는 jal마다 덮어써지므로, 다른 함수를 호출하는 함수는 자신의 복귀 주소를 처음에 스택에 저장해야 합니다. 리프 함수는 jal을 사용하지 않으므로 ra가 망가지지 않아 저장 없이 ret할 수 있습니다. 게다가 호출 대상 저장 레지스터도 사용하지 않는다면 스택 프레임을 만들 필요조차 없습니다. x86의 call 명령어는 복귀 주소를 반드시 스택에 쌓으므로 이 점이 RISC-V와의 차이입니다.

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

ISA와 어셈블리의 다른 문제

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