ISA와 어셈블리
다른 함수를 호출하지 않는 함수(리프 함수)에서는 ra를 스택에 저장하지 않아도 되는 경우가 많다. 그 이유로 올바른 것은?
- A리프 함수에서는 ret 명령어를 사용하지 않기 때문
- B리프 함수의 복귀 주소는 CPU가 자동으로 스택에 쌓기 때문
- C다른 함수를 호출하지 않으므로 ra가 덮어써지지 않아 복귀 주소가 그대로 남아 있기 때문
정답과 해설 보기
정답: C. 다른 함수를 호출하지 않으므로 ra가 덮어써지지 않아 복귀 주소가 그대로 남아 있기 때문
ra는 함수를 호출하는 jal마다 덮어써지므로, 다른 함수를 호출하는 함수는 자신의 복귀 주소를 처음에 스택에 저장해야 합니다. 리프 함수는 jal을 사용하지 않으므로 ra가 망가지지 않아 저장 없이 ret할 수 있습니다. 게다가 호출 대상 저장 레지스터도 사용하지 않는다면 스택 프레임을 만들 필요조차 없습니다. x86의 call 명령어는 복귀 주소를 반드시 스택에 쌓으므로 이 점이 RISC-V와의 차이입니다.