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