sw
lyszt.net охватывает sw и другие инструкции RISC-V более подробно.
Формат кодирования
Описание
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
