ISA와 어셈블리

M 확장이 없는 RV32I CPU용으로 C 언어의 'a * b'(int끼리의 곱셈)를 컴파일하면 일반적으로 어떻게 되는가?

  1. A시프트와 덧셈을 반복하여 곱셈을 수행하는 라이브러리 함수 호출이 된다
  2. B곱셈은 사용할 수 없으므로 컴파일 오류가 된다
  3. CM 확장의 mul 명령어가 그대로 출력되고 실행 시 자동으로 추가된다
정답과 해설 보기

정답: A. 시프트와 덧셈을 반복하여 곱셈을 수행하는 라이브러리 함수 호출이 된다

곱셈기가 없는 CPU용으로는 컴파일러가 곱셈을 __mulsi3 같은 보조 라이브러리 함수 호출로 치환합니다. 이 함수는 한쪽 수의 비트를 하나씩 조사하여 1이면 다른 쪽을 시프트한 값을 더하는, 필산과 같은 방법으로 곱을 구합니다. 올바르게 계산되지만 하드웨어 곱셈기보다 수십 배 느려집니다. ISA 확장을 생략하면 회로가 작아지는 대신 처리는 느려집니다.

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

ISA와 어셈블리의 다른 문제

  1. 예전 MIPS 등에 있었던 분기 지연 슬롯(분기 명령어 직후의 1개 명령어는 분기 여부와 관계없이 실행되는 규칙)에 대해 올바른 것은?
  2. 64비트 RV64I에서 lw 명령어를 실행하면 읽어 들인 32비트 값은 64비트 레지스터에 어떻게 들어가는가?
  3. ABI(애플리케이션 바이너리 인터페이스)에 대한 설명으로 올바른 것은?
  4. C 언어의 함수 포인터를 사용한 호출 '(*fp)(x)'는 RISC-V에서 일반적으로 어떤 명령어로 이루어지는가?
  5. 동일한 명령어 집합 아키텍처(ISA)를 채택한 두 CPU에 대해 올바른 것은?