sh
lyszt.net은 sh 및 기타 RISC-V 명령어를 더 자세히 다룹니다.
인코딩 형식
설명
sh는 하프워드(16비트 또는 2바이트)를 메모리에 씁니다. 이는 lh 및 lhu 로드와 대응되며, sw가 전체 워드를 저장하는 반면 더 좁은 크기를 저장합니다. 형식은 아래와 같습니다. 소스 레지스터 rs2의 값을 가져와 그 하위 16비트를 베이스 레지스터 rs1의 주소에 오프셋을 더한 위치에 씁니다. 레이아웃은 sw와 일치하며, 소스 레지스터가 먼저 지정됩니다.
sh rs2, offset(rs1)
레지스터는 32비트를 보유하고 16비트만 저장되므로, sh는 하위 16비트를 유지하고 상위 16비트를 버립니다. 저장에는 부호 있는/없는 선택이 없습니다. 그 선택은 로드에 속하며, 좁은 값을 레지스터를 채우기 위해 확장해야 하고 누락된 비트에 대한 규칙이 필요합니다. 저장은 값을 좁히며, 하위 비트를 유지하는 것이 유일하게 합리적인 동작입니다. 레지스터가 16비트에 비해 너무 큰 값을 보유하면, 여분의 비트는 경고 없이 손실되므로 저장하기 전에 범위를 확인하세요.
RISC-V 매뉴얼에 따르면 sh는 레지스터 rs2의 하위 16비트를 rs1의 주소에 부호 확장된 12비트 오프셋을 더한 메모리에 저장합니다. 짝수 주소에 대한 하프워드 저장은 자연 정렬되어 있으며 정렬 오류를 발생시키지 않습니다. 자연 정렬되지 않은 주소에 대한 저장은 실행 환경이 정의하는 대로 동작하며, 매뉴얼에 따르면 매우 느리게 실행될 수 있습니다.
sh는 lh 및 lhu가 다시 읽는 모든 16비트 형식(예: 오디오 샘플, 16비트 픽셀 데이터, 하프워드 배열)을 씁니다. 일반적인 패턴은 읽기, 수정, 쓰기입니다. lhu로 하프워드를 로드하고, 레지스터에서 조정한 후 sh로 다시 저장합니다. 대상 2바이트만 변경되고 주변 바이트는 그대로 유지됩니다. 하프워드는 2바이트 간격으로 위치하므로 루프는 주소를 2씩 이동합니다.
예시
la t0, slot li t1, -5 sh t1, 0(t0) # memory at slot now holds the low 16 bits of -5
