auipc

auipc

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

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

Опис

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