sb

sb

RISC-V アセンブリ 参考

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

説明

sb は 1 バイト (8 ビット) をメモリに書き込みます。これはストアが書き込める最小の量です。これは lb および lbu ロードのストア版に相当します。構文は以下に示します。ソースレジスタ rs2 の値を読み取り、その最下位 8 ビットをベースレジスタ rs1 にオフセットを加えたアドレスに書き込みます。オペランドの配置は sw と一致し、ソースレジスタが最初に記載されます。

sb rs2, offset(rs1)

レジスタの 32 ビットのうち最下位 8 ビットのみがメモリに到達し、残りのビットは破棄されます。ストアは値を狭めて下位バイトを保持するため、符号付きまたは符号なしの形式はありません。1 バイトより広い値は警告なしに余分なビットを失います。300 を格納すると 44 が書き込まれます。これは 300 が 256 を超えてラップするためです。

メモリの最小単位はバイトであるため、sb は 1 バイトずつデータを構築します。これは、テキストを 1 文字ずつ組み立てる、バッファを埋める、個々の色の値を書き込むなどのタスクに使用されます。連続するバイトは 1 つ離れたアドレスを占めるため、ループは 1 を加算して進みます。

RISC-V マニュアルには、sb はレジスタ rs2 の下位 8 ビットを、rs1 に符号拡張された 12 ビットオフセットを加えたアドレスのメモリに格納すると記載されています。メモリはバイトアドレス指定であるため、バイトストアは常に自然に整列されます。

一般的な演習では、テキストを手書きで書きます。各文字のコードを sb で格納し、シーケンスを 0 バイトで終了してから、それを出力します。メモリ内のコード 72、105、0 は単語 Hi として出力され、文字列がゼロで終端された連続するメモリスロット内のバイトであることを示します。ストアは対象の 1 バイトのみを変更し、その隣のバイトは以前の値を保持します。

例

la t0, slot
li t1, 200
sb t1, 0(t0)   # memory at slot now holds the low 8 bits, 200