ISA와 어셈블리
C 언어의 함수 포인터를 사용한 호출 '(*fp)(x)'는 RISC-V에서 일반적으로 어떤 명령어로 이루어지는가?
- A함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다
- Bjal에 함수의 주소를 즉치값으로 써서 점프한다
- Cbeq로 함수의 주소와 비교하여 같으면 점프한다
정답과 해설 보기
정답: A. 함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다
함수 포인터가 가리키는 곳은 실행 시까지 알 수 없으므로, 명령어 안에 목적지를 쓰는 jal은 사용할 수 없습니다. 그래서 포인터 값을 레지스터에 읽어 들이고 'jalr ra, 0(t0)'처럼 레지스터의 주소로 점프하며 복귀 주소는 ra에 남깁니다. C++의 가상 함수나 공유 라이브러리 함수 호출도 같은 간접 호출입니다. 목적지가 바뀌므로 CPU는 간접 분기 예측기로 목적지를 예상합니다.