ISA와 어셈블리

메모리 상의 1바이트에 0x80이 들어 있다. RISC-V의 lb 명령어와 lbu 명령어로 이 바이트를 32비트 레지스터에 읽어 들였을 때의 값의 조합으로 올바른 것은?

  1. Alb에서는 0x00000080(128), lbu에서는 0xFFFFFF80(-128)
  2. Blb에서는 0xFFFFFF80(-128), lbu에서는 0x00000080(128)
  3. C둘 다 0x00000080(128)이 된다
정답과 해설 보기

정답: B. lb에서는 0xFFFFFF80(-128), lbu에서는 0x00000080(128)

lb(load byte)는 읽어 들인 1바이트를 부호 있는 값으로 간주하고 최상위 비트를 상위 24비트에 복사합니다(부호 확장). 0x80은 최상위 비트가 1이므로 0xFFFFFF80, 즉 -128이 됩니다. lbu(load byte unsigned)는 상위를 0으로 채우므로(제로 확장) 128입니다. C 언어에서 signed char와 unsigned char를 읽을 때 컴파일러는 이 두 명령어를 구분하여 사용합니다.

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

ISA와 어셈블리의 다른 문제

  1. 조건 분기 구조에 대해 RISC-V와 x86의 차이로 올바른 것은?
  2. RISC-V 명령어 'slt t0, a0, a1'의 동작으로 올바른 것은?
  3. 위의 RISC-V 코드를 실행 완료했을 때 t0의 값은 얼마인가?
  4. RISC-V의 조건 분기 명령어(B 형식)는 분기 대상까지의 거리를 13비트 부호 있는 바이트 수로 나타내며, 그 최하위 비트는 항상 0이므로 명령어에 넣지 않는다. 분기 명령어가 직접 닿는 범위로 대략 올바른 것은?
  5. RISC-V 명령어 'jal ra, func'의 동작으로 올바른 것은?