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 бит) в память — это наименьший объём, который может записать store. Это store-эквивалент загрузок lb и lbu. Синтаксис приведён ниже. Он читает значение из регистра-источника rs2 и записывает его младшие 8 бит по адресу, образованному базовым регистром rs1 плюс смещение. Расположение операндов совпадает с sw, при этом регистр-источник указан первым.

sb rs2, offset(rs1)

В память попадают только младшие 8 из 32 бит регистра, а остальные биты отбрасываются. У store нет знаковой или беззнаковой формы, поскольку он сужает значение и сохраняет младший байт. Значение шире байта теряет лишние биты без предупреждения. Сохранение 300 записывает 44, потому что 300 выходит за 256.

Наименьшая единица памяти — байт, поэтому sb строит данные по одному байту за раз, например для сборки текста посимвольно, заполнения буфера или записи отдельных значений цвета. Последовательные байты занимают адреса с разницей в единицу, поэтому цикл продвигается, прибавляя 1.

Руководство RISC-V указывает, что sb сохраняет младшие 8 бит регистра rs2 в память по адресу rs1 плюс 12-битное смещение со знаком. Память адресуется побайтно, поэтому store байта всегда естественно выровнен.

Распространённое упражнение — записать текст вручную. Сохраните код каждого символа с помощью sb, завершите последовательность байтом 0, затем выведите её. Коды 72, 105 и 0 в памяти выводятся как слово Hi, что показывает, что строка — это байты в последовательных ячейках памяти, завершённые нулём. Store изменяет только один целевой байт, а соседние байты сохраняют свои прежние значения.

Пример

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