sh

sh

RISC-V アセンブリ 参考

lyszt.netはshおよびその他の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

説明

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