rs2, off(rs1)mem[rs1 + off] = rs2sb stores a single byte (8 bits) to memory — the smallest store there is. It is the writing counterpart to the lb/lbu loads. The form is sb rs2, offset(rs1): take the value in source register rs2 and write its lowest 8 bits to the address in base register rs1 plus the offset (the store layout from sw, source register first).
Of the 32 bits in the register, only the lowest 8 are written; the rest are dropped. As with all stores there is no signed/unsigned variant, because narrowing has no missing bits to fill — it simply keeps the low byte. If the value was larger than a byte, the overflow is silently discarded: storing 300 actually writes 44, since 300 wraps around past 256.
A byte is the finest unit memory offers, so sb is the tool for building data one byte at a time: assembling text character by character, filling a buffer, writing individual color values. Bytes sit one address apart, so a loop advances by adding 1.
The classic exercise is writing text by hand: store each character's code with sb, finish with a 0 byte to mark the end, then print it. Watching the codes 72, 105, 0 in memory turn into the printed word Hi makes concrete what a string really is underneath — just bytes in consecutive memory slots, ended by a zero. Only the one targeted byte changes on each store; its neighbours are untouched.