lhu

lhu

RISC-V 어셈블리 참조

lyszt.net은 lhu 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

인코딩 형식

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

설명

lhu는 메모리에서 하프워드(16비트, 즉 2바이트)를 읽어 부호 없는 값으로 취급합니다. 이는 lh와 짝을 이루며, 둘은 목적지 레지스터의 상위 절반을 채우는 방식에서 다릅니다. 둘 다 동일한 주소 지정 방식으로 16비트를 읽습니다. 하프워드와 주소 지정 형식은 lh 페이지에서 다룹니다. lhu의 형식은 아래와 같습니다.

lhu rd, offset(rs1)

레지스터는 32비트를 담으므로, 16비트 로드는 상위 16비트를 채워야 합니다. lh는 부호 비트를 그 비트들에 복사하여 음수를 음수로 유지합니다. lhu는 그 비트들을 0으로 채우며, 이를 제로 확장이라고 하므로 결과는 항상 음수가 아니고 0에서 65535까지입니다. 이름의 u는 부호 없는 읽기를 나타냅니다.

어느 것을 사용할지는 데이터가 결정합니다. 음수가 될 수 있는 값에는 lh를, 절대 음수가 되지 않는 값에는 lhu를 선택하세요. 비트 패턴 0xFFFF를 lhu로 로드하면 65535이고, 같은 비트를 lh로 로드하면 -1입니다.

RISC-V 매뉴얼은 lhu를 메모리에서 16비트 값을 로드하여 rd에 저장하기 전에 32비트로 제로 확장하는 것으로 정의합니다. 유효 주소는 레지스터 rs1에 부호 확장된 12비트 오프셋을 더한 값입니다.

대부분의 16비트 데이터는 부호가 없습니다. 일부 텍스트 인코딩의 문자 코드, 네트워크 데이터의 포트 번호와 체크섬, 16비트 픽셀 형식, 파일 형식의 길이 필드 등이 예입니다. 부호 확장은 최상위 비트가 설정되면 그중 어느 것에도 잘못된 값을 주므로, lhu가 올바른 로드입니다. 하프워드는 2바이트 간격으로 위치하므로, 이를 순회하는 루프는 주소를 2씩 이동합니다.

예시

.data
val: .half 0xffff
.text
la t0, val
lhu t1, 0(t0)   # t1 = 65535 (zero-extended)