sw

sw

RISC-V Ассемблер Ссылка

lyszt.net охватывает sw и другие инструкции 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

Описание

sw берёт значение из регистра и записывает его в память — противоположность lw. Название означает store word (сохранить слово), а слово — это 32 бита. Загрузки перемещают данные из памяти в регистры, чтобы с ними можно было работать, а сохранения отправляют результаты обратно. Эти две инструкции составляют цикл загрузки, вычисления и сохранения в RISC-V, поскольку арифметика выполняется только в регистрах.

Синтаксис sw приведён ниже. Порядок операндов отличается от большинства инструкций.

sw rs2, offset(rs1)

rs2 содержит значение для записи. Второй операнд, offset(rs1), задаёт адрес назначения в памяти: адрес в базовом регистре rs1 плюс небольшое постоянное смещение — та же адресация, которую использует lw. Следующая строка записывает значение из t1 по адресу, хранящемуся в t0.

sw t1, 0(t0)

sw оставляет все регистры без изменений. Его эффект полностью приходится на память, тогда как почти каждая другая инструкция записывает в регистр.

Руководство RISC-V указывает, что sw, sh и sb сохраняют в память 32-, 16- и 8-битные значения из младших битов регистра rs2. Эффективный адрес — это регистр rs1 плюс 12-битное смещение со знаком. Загрузки и сохранения по естественно выровненным адресам никогда не вызывают ошибку выравнивания, и руководство гарантирует, что они выполняются атомарно, как один неделимый шаг.

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

Пример

la t0, slot
li t1, 99
sw t1, 0(t0)   # memory at slot now holds 99