lb

lb

RISC-V アセンブリ 参考

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

説明

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)