ISA와 어셈블리

RISC-V에서 12비트 즉치값에 들어가지 않는 32비트 상수(예: 0x12345678)를 레지스터에 넣는 일반적인 방법은?

  1. Aaddi를 1회 사용하여 32비트 즉치값을 그대로 쓴다
  2. Blui로 상위 20비트를 설정하고 addi로 하위 12비트를 더한다
  3. C상수는 사용할 수 없으므로 반드시 입력에서 읽어 들인다
정답과 해설 보기

정답: B. lui로 상위 20비트를 설정하고 addi로 하위 12비트를 더한다

lui(load upper immediate)는 20비트 즉치값을 레지스터의 비트 31~12에 두고 하위 12비트를 0으로 만듭니다. 이어서 addi로 하위 12비트를 더하면 임의의 32비트 상수를 만들 수 있습니다. 어셈블리에서 'li a0, 0x12345678'이라고 쓰면 어셈블러가 필요에 따라 이 2개의 명령어로 전개합니다. 명령어 길이를 고정한 ISA에서는 큰 상수를 나누어 만드는 것이 일반적입니다.

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

ISA와 어셈블리의 다른 문제

  1. RISC-V에서 상수 0x12345FFF를 lui와 addi의 2개 명령어로 만들 때 올바른 조합은?
  2. RISC-V의 auipc 명령어(add upper immediate to PC)의 동작으로 올바른 것은?
  3. RISC-V(RV32I)에서 'addi t0, zero, -1'을 실행한 후 t0에 들어 있는 32비트 값은?
  4. 메모리 상의 1바이트에 0x80이 들어 있다. RISC-V의 lb 명령어와 lbu 명령어로 이 바이트를 32비트 레지스터에 읽어 들였을 때의 값의 조합으로 올바른 것은?
  5. 조건 분기 구조에 대해 RISC-V와 x86의 차이로 올바른 것은?