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 将一个字节(8 位)写入内存,这是存储可以写入的最小量。它是 lb 和 lbu 加载的存储对应物。语法如下所示。它读取源寄存器 rs2 中的值,并将其最低 8 位写入由基址寄存器 rs1 加上偏移量形成的地址。操作数布局与 sw 匹配,源寄存器列在前面。

sb rs2, offset(rs1)

只有寄存器 32 位中的最低 8 位到达内存,其余位被丢弃。存储没有有符号或无符号形式,因为它会收窄值并保留低字节。宽于一个字节的值会丢失多余的位,且不会有任何警告。存储 300 会写入 44,因为 300 超过 256 后回绕。

内存的最小单位是字节,因此 sb 一次一个字节地构建数据,用于诸如逐字符组装文本、填充缓冲区或写入单个颜色值等任务。连续的字节占据相隔一的地址,因此循环通过加 1 来推进。

RISC-V 手册指出,sb 将寄存器 rs2 的低 8 位存储到 rs1 加上符号扩展的 12 位偏移量的地址处的内存中。内存是按字节寻址的,因此字节存储始终自然对齐。

一个常见的练习是手工编写文本。用 sb 存储每个字符的代码,用 0 字节结束序列,然后打印它。内存中的代码 72、105 和 0 打印为单词 Hi,这表明字符串是连续内存槽中的字节,以零终止。存储只更改目标的一个字节,其旁边的字节保持先前的值。

示例

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