lbu

lbu

RISC-V アセンブリ 参考

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

説明

lbu はメモリから 1 バイト (8 ビット) を符号なしの値として読み出します。これは lb と対をなし、両者の違いはレジスタの残りの部分をどのように埋めるかだけです。どちらも同じアドレッシングを用いて 1 バイトを読み出します。バイトとアドレッシング形式については lb のページで扱っています。lbu の形式は以下のとおりです。

lbu rd, offset(rs1)

レジスタは 32 ビットを保持するため、1 バイトのロードでは 24 ビットを埋める必要があります。lb はそのバイトの最上位ビットをそれらのビットにコピーします。これは符号拡張であり、負の数を生み出すことがあります。lbu はそれらを 0 で埋めるため、結果は常に 0 から 255 の間になります。u は符号なし (unsigned) の読み出しを表します。

テキストのロードには通常 lbu を使用します。文字コードは符号なしであり、アクセント付きの文字やさまざまな記号を含め、多くの文字コードは最上位ビットがセットされています。符号拡張する lb はそれらを負にしてしまい、比較が壊れます。標準的なテキストループは lbu を使用します。1 バイトをロードし、それがゼロかどうか (テキストの終端を示す) を確認し、それを処理してアドレスに 1 を加えます。

RISC-V のマニュアルでは、lb と lbu をハーフワードロードの 8 ビット版として定義しており、実効アドレスはレジスタ rs1 に符号拡張された 12 ビットのオフセットを加えたものと同じです。メモリはバイトアドレス指定なので、各アドレスは 1 バイトを指します。

lbu は他のバイトデータ、たとえば画像の色チャネル、生のデータバッファ、インタプリタにおける命令バイトなどにも適しています。この方法でロードされたバイトには扱うべき符号がないため、単一のバイトからより大きな値を再構築する際にシフトや OR と直接組み合わせることができます。8 ビットデータが符号付きである場合にのみ lb を使用してください。

例

.data
val: .byte 0xff
.text
la t0, val
lbu t1, 0(t0)   # t1 = 255 (zero-extended)