lh

lh

RISC-V 어셈블리 참조

lyszt.net은 lh 및 기타 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

설명

lh는 메모리에서 하프워드를 로드합니다. 바이트는 8비트이며 자체 주소를 가지므로 가장 작은 주소 지정 가능 단위입니다. 워드는 4바이트, 즉 32비트이고, 하프워드는 그 절반인 2바이트, 즉 16비트입니다. lh는 lw가 32비트를 읽는 곳에서 16비트를 읽습니다. 주소 지정은 lw와 동일합니다: 베이스 레지스터에 상수 오프셋을 더합니다(lw 페이지 참조). 형식은 아래와 같습니다.

lh rd, offset(rs1)

레지스터는 32비트를 보유하므로, 16비트 로드는 나머지 16비트를 채워야 합니다. lh는 부호 확장을 사용합니다. 16비트 값의 최상위 비트를 읽는데, 이는 부호 있는 수의 부호를 나타내며, 그 비트를 레지스터의 상위 16비트 모두에 복사합니다. 값은 부호를 유지하므로, 16비트 -3은 32비트 -3으로 도착합니다.

lh는 부호 있는 16비트 데이터, 예를 들어 음수가 될 수 있는 오디오 샘플이나 센서 판독값에 사용합니다. 그 짝인 lhu는 u가 unsigned를 의미하며, 상위를 0으로 채우는데, 이는 결코 음수가 되지 않는 데이터에 적합합니다. 비트 패턴 0x8000은 lh로 로드하면 -32768이 되고, lhu로 로드하면 +32768이 됩니다. 메모리의 비트는 그대로 유지되며, 로드가 의미를 결정합니다.

RISC-V 매뉴얼은 lh를 메모리에서 16비트 값을 로드하고 rd에 저장하기 전에 32비트로 부호 확장하는 것으로 정의합니다. 유효 주소는 레지스터 rs1에 부호 확장된 12비트 오프셋을 더한 것입니다. 접근의 주소가 그 접근의 크기(바이트 단위)로 나누어떨어질 때 그 접근은 자연 정렬되므로, 하프워드 접근은 짝수 주소에서 정렬됩니다.

하프워드는 2바이트이므로, 그 배열은 오프셋 0, 2, 4에 위치하며, 포인터는 2를 더함으로써 그들을 이동합니다.

예시

.data
val: .half -5
.text
la t0, val
lh t1, 0(t0)   # t1 = -5 (sign-extended)