lh
lyszt.netはlhおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
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)
