lw

lw

Асемблер RISC-V Посилання

lyszt.net охоплює lw та інші інструкції 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

Опис

lw копіює значення з пам'яті в регістр. 32 регістри утворюють невелику швидку робочу область процесора. Пам'ять розташовується поряд з ними як велике сховище: довгий ряд пронумерованих комірок, який містить масиви, текст і змінні. Номер комірки — це її адреса. Обчислення відбуваються в регістрах, а дані очікують у пам'яті між використаннями.

RISC-V виконує арифметику лише над регістрами, ніколи безпосередньо над пам'яттю, тому значення потрібно завантажити в регістр перед використанням і зберегти назад після. lw виконує завантаження. Назва означає load word (завантажити слово), а слово — це 32-бітне значення, ширина одного регістра.

Форма lw показана нижче. Вона бере значення з rs1, регістра, що містить адресу пам'яті, яка називається базою, додає offset, невелику константу, і читає значення за отриманою адресою в регістр призначення rd.

lw rd, offset(rs1)

Наступний рядок завантажує значення на 8 байтів далі від адреси в t0.

lw t1, 8(t0)

Посібник RISC-V називає RISC-V архітектурою load-store: інструкції завантаження та збереження — єдині, що звертаються до пам'яті, а арифметичні інструкції працюють лише з регістрами. Адресний простір становить 32 біти й адресується побайтово, а ефективна адреса завантаження — це регістр rs1 плюс 12-бітний offset зі знаковим розширенням. Середовище виконання, тобто система, у якій працює програма, вирішує, чи зберігає пам'ять молодший значущий байт першим, що називається little-endian, чи старший значущий байт першим, що називається big-endian. Доступ є природно вирівняним, коли його адреса ділиться націло на розмір доступу, який для слова становить 4 байти. Природно вирівняні доступи ніколи не викликають помилку вирівнювання. Невирівняний доступ поводиться так, як визначає середовище, і може працювати дуже повільно.

Offset тут тому, що елементи в пам'яті розташовуються на регулярних відстанях. Слово — це 4 байти, тому послідовні елементи масиву лежать на відстані 4 байти один від одного, за зміщеннями 0, 4, 8 і так далі. la розміщує початкову адресу масиву в регістрі, а зміна offset читає різні елементи. Приклад завантажує двох сусідів масиву. Offset 0 дає перше значення, 10, а offset 4 дає наступне значення, 20.

Приклад

.data
arr: .word 10, 20
.text
la t0, arr
lw t1, 0(t0)   # t1 = 10
lw t2, 4(t0)   # t2 = 20