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)