ISA와 어셈블리

C 언어의 함수 포인터를 사용한 호출 '(*fp)(x)'는 RISC-V에서 일반적으로 어떤 명령어로 이루어지는가?

  1. A함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다
  2. Bjal에 함수의 주소를 즉치값으로 써서 점프한다
  3. Cbeq로 함수의 주소와 비교하여 같으면 점프한다
정답과 해설 보기

정답: A. 함수의 주소를 레지스터에 넣고 jalr로 그 레지스터의 주소로 점프한다

함수 포인터가 가리키는 곳은 실행 시까지 알 수 없으므로, 명령어 안에 목적지를 쓰는 jal은 사용할 수 없습니다. 그래서 포인터 값을 레지스터에 읽어 들이고 'jalr ra, 0(t0)'처럼 레지스터의 주소로 점프하며 복귀 주소는 ra에 남깁니다. C++의 가상 함수나 공유 라이브러리 함수 호출도 같은 간접 호출입니다. 목적지가 바뀌므로 CPU는 간접 분기 예측기로 목적지를 예상합니다.

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

ISA와 어셈블리의 다른 문제

  1. 동일한 명령어 집합 아키텍처(ISA)를 채택한 두 CPU에 대해 올바른 것은?
  2. RISC-V와 같은 로드-스토어 아키텍처의 특징으로 올바른 것은?
  3. RISC-V의 레지스터 x0(zero)의 성질로 올바른 것은?
  4. RISC-V의 RV32I(32비트 기본 정수 명령어 집합)가 가진 범용 정수 레지스터로 올바른 것은?
  5. 어셈블리 언어와 기계어의 관계로 올바른 것은?