lb
lyszt.netはlbおよびその他のRISC-V命令をより詳しく扱っています。
エンコーディング形式
説明
lb はメモリから 1 バイトを読み出します。これはロードが取得できる最小単位です。メモリはバイトから構成され、各バイトは 8 ビットで、1 つのアドレスが 1 つのバイトを識別します。lw は 4 バイト、lh は 2 バイト、lb は 1 バイトを読み出します。他のロードと同じアドレッシングを使用します。つまり、ベースレジスタとオフセットです(lw のページを参照)。形式は以下のとおりです。
lb rd, offset(rs1)
レジスタは 32 ビットを保持し、バイトは 8 ビットを保持するため、上位 24 ビットに値が必要です。lb は符号拡張を行います。つまり、バイトの最上位ビットをすべての上位ビットにコピーし、値を符号付き数値として保ちます。-5 を保持するバイトは、32 ビットの -5 として到着します。
符号付き/符号なしの選択は、最も一般的なバイトデータであるテキストで最も重要です。なぜなら、文字コードは符号なしだからです。多くの文字コードは最上位ビットがセットされています。それを符号拡張する lb でロードすると負の数になり、通常の正の文字コードとの比較が失敗します。テキストには lbu(符号なしバイトロード)を使用してください。これは上位ビットを 0 で埋めます。lb は、正にも負にもなり得る小さなオフセットなど、符号付きデータに使用してください。
RISC-V マニュアルは lb と lbu をハーフワードロードの 8 ビット版として定義しており、実効アドレスはレジスタ rs1 に符号拡張された 12 ビットオフセットを加えたものと同じです。メモリはバイトアドレス指定なので、1 つのアドレスが 1 つのバイトを識別します。
バイトは 1 アドレスずつ離れて並んでいるため、ループはアドレスに 1 を加えることでバイト配列を進みます。典型的なループは、バイトを読み取り、それがゼロかどうか(テキストの終わりを示すマーカー)を確認し、それに対して処理を行い、アドレスを 1 進めます。
例
.data val: .byte -5 .text la t0, val lb t1, 0(t0) # t1 = -5 (sign-extended)
