ISA와 어셈블리

RISC-V의 의사 명령어 'ret'은 실제로 어떤 명령어로 실행되는가?

  1. Ajal ra, 0
  2. Bjalr x0, 0(ra)
  3. Clw ra, 0(sp)
정답과 해설 보기

정답: B. jalr x0, 0(ra)

jalr(jump and link register)은 레지스터의 값에 오프셋을 더한 주소로 점프하고, 다음 명령어의 주소를 쓰기 대상에 넣습니다. ret은 'jalr x0, 0(ra)'이며, ra의 주소로 점프하고 링크는 x0에 버립니다. jalr은 함수 포인터나 가상 함수 호출처럼 목적지가 실행 시에 정해지는 점프에도 사용됩니다. ra를 복원하는 'lw ra, …'는 ret 전에 하는 준비입니다.

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

ISA와 어셈블리의 다른 문제

  1. 호출 규약(콜링 컨벤션)이 정해져 있는 주된 목적은?
  2. RISC-V의 표준 호출 규약에서 정수 인자와 반환값을 전달하는 데 사용하는 레지스터로 올바른 것은?
  3. RISC-V의 표준 호출 규약에서 정수 인자가 10개인 함수를 호출할 때 9번째와 10번째 인자는 어디로 전달되는가?
  4. RISC-V 호출 규약에서 s0~s11이 '호출 대상 저장(callee-saved)' 레지스터라는 의미로 올바른 것은?
  5. RISC-V 호출 규약에서 t0~t6은 '호출 원본 저장(caller-saved)' 레지스터이다. 어떤 함수가 t0에 넣은 값을 다른 함수를 호출한 뒤에도 사용하고 싶을 때 올바른 대응은?