auipc
lyszt.net охоплює auipc та інші інструкції RISC-V більш детально.
Формат кодування
Опис
auipc означає add upper immediate to PC. Вона працює як lui, беручи 20-бітну константу як старшу частину значення. auipc додає це значення до лічильника команд, який зберігає адресу поточної виконуваної інструкції (див. сторінку beq). Результатом є адреса, виміряна відносно того місця, де ця інструкція розташована в пам'яті.
Відносні адреси вирішують реальну проблему. Програма не завжди знає, куди в пам'яті її буде завантажено. Код, який звертається до своїх даних за фіксованими абсолютними адресами, зазнає збою, коли його завантажують в інше місце. Код, який обчислює адреси відносно поточної інструкції, працює будь-де, куди б його не розмістили. Ця властивість називається позиційною незалежністю.
auipc надає грубу частину такої адреси, а наступна інструкція додає точний 12-бітний залишок. Інструкція la, яка завантажує адресу мітки, побудована з цієї пари, як і виклики віддалених функцій.
Посібник RISC-V каже, що поточний pc можна отримати, встановивши константу auipc у 0. auipc, за яким слідує jalr, може передати керування на будь-яку 32-бітну адресу відносно pc, а auipc, за яким слідує завантаження або збереження з 12-бітним зміщенням, може отримати доступ до будь-якої 32-бітної адреси даних відносно pc.
la і call існують, щоб вам не доводилося писати auipc вручну, і вона часто з'являється в трасуванні симулятора та в дизасембльованому коді. auipc, за яким слідує інструкція з невеликим зміщенням, що разом утворюють одну адресу, — це корисний шаблон, який варто розпізнавати.
Приклад
auipc t0, 1 # t0 = pc + 0x1000
