addi

addi

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

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

Опис

addi додає константу до регістра. Назва означає add immediate (додати безпосереднє значення). Безпосереднє значення — це константа, записана в самій інструкції, а не прочитана з регістра. Використовуйте її, коли одне з чисел фіксоване під час написання програми, наприклад під час додавання 1 до лічильника.

Форму addi показано нижче. Вона читає значення з вихідного регістра rs1, додає константу imm і записує результат у регістр призначення rd.

addi rd, rs1, imm

Наступний рядок читає t0, додає одиницю й записує результат назад, тож t0 = t0 + 1.

addi t0, t0, 1

Константа займає 12 бітів і є знаковою, що дає діапазон від -2048 до 2047. Асемблер відхиляє більші значення. Для більшої константи спершу завантажте її в регістр за допомогою li. Від'ємна константа змушує addi також віднімати, тому в RISC-V немає окремої інструкції віднімання безпосереднього значення. Наступний рядок веде відлік униз.

addi t0, t0, -1

Посібник RISC-V називає константу 12-бітовим безпосереднім значенням із розширенням знака. У ньому зазначено, що арифметичне переповнення ігнорується, тому результат зберігає лише свої молодші XLEN бітів, де XLEN — ширина регістра в бітах, тут 32. Коли знак константи відомий, одна гілка після додавання перевіряє знакове переповнення. Два рядки нижче обробляють поширений випадок додавання додатної константи.

addi t0, t1, +imm
blt t0, t1, overflow

Програми використовують addi для лічильників, для переміщення вказівника до наступного елемента та для резервування місця в стеку. Приклад додає 1, щоб просунути лічильник, і додає -16, щоб зарезервувати 16 байтів робочої пам'яті, — так зазвичай починається функція, якій потрібен робочий простір.

Приклад

addi t0, t0, 1     # t0++
addi sp, sp, -16   # reserve 16 bytes of stack