lw
lyszt.net охоплює lw та інші інструкції RISC-V більш детально.
Формат кодування
Опис
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
