la
псевдоlyszt.net охоплює la та інші інструкції RISC-V більш детально.
Опис
la завантажує адресу чогось у регістр. Ця адреса — це комірка пам'яті, а значення, що зберігається в цій комірці, — це щось окреме. Назва розшифровується як load address (завантажити адресу).
Коли ви резервуєте дані в пам'яті, ви даєте їм ім'я, наприклад arr або msg, що позбавляє вас від відстеження необроблених чисел-адрес. Це ім'я — мітка, читабельна заміна адреси пам'яті. Наступний рядок завантажує адресу, позначену міткою arr, у t0. Він надає місцеположення, з якого починається масив, і не читає вміст масиву.
la t0, arr
Інструкції завантаження та збереження (lw, sw та решта) приймають адресу, що зберігається в регістрі. Перш ніж ви зможете прочитати або записати іменовані дані, їхня адреса має бути в регістрі, і la розміщує її там. Читання значення потребує двох інструкцій. la знаходить, де розташовані дані, а lw читає те, що там є.
Посібник з RISC-V описує auipc як інструкцію для побудови адрес відносно pc. У ньому зазначено, що auipc, за яким іде завантаження або збереження з 12-бітним зсувом, може досягти будь-якої 32-бітної адреси даних відносно pc.
Адреса та її вміст різняться так само, як різняться вказівник і значення. Після того як адреса перебуває в регістрі, ви дістаєтеся до окремих елементів, додаючи до неї зсуви. У прикладі адреса фрагмента тексту завантажується в a0, що вимагає служба друку рядків. Їй потрібно повідомити, де розташований текст, і вона читає текст звідти. la — це псевдоінструкція, яку асемблер будує з кількох справжніх інструкцій.
Розгортається до
auipc rd, hi(label) addi rd, rd, lo(label)
Асемблер замінює цю псевдоінструкцію реальною інструкцією або інструкціями, переліченими вище.
Приклад
.data msg: .string "hi" .text la a0, msg # a0 = address of msg
