add

add

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

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

Опис

add додає значення у двох регістрах і зберігає результат у третьому. Регістр — це невеликий слот усередині процесора, який зберігає одне 32-бітне число. RISC-V надає 32 регістри. Біт — це один 0 або 1, а 32 біти охоплюють цілі числа від 0 приблизно до чотирьох мільярдів. Арифметика виконується між регістрами й ніколи не торкається пам'яті безпосередньо.

add має наведену нижче форму, і результат дорівнює rd = rs1 + rs2. rd — це регістр призначення, куди потрапляє відповідь. rs1 і rs2 — це вихідні регістри, і їхні значення залишаються незмінними.

add rd, rs1, rs2

Регістр призначення може також слугувати джерелом. Наведений нижче рядок додає t1 до t0 і поміщає результат назад у t0. Накопичувальні суми в циклах використовують цю форму.

add t0, t0, t1

Регістр зберігає щонайбільше 32 біти. Коли сума перевищує найбільше значення, яке може зберігати регістр, результат загортається в невелике число, подібно до того як 24-годинний годинник переходить з 23:59 назад на 00:00. Це переповнення, і RISC-V не видає жодного попередження, коли воно відбувається.

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

add t0, t1, t2
bltu t0, t1, overflow

У прикладі перші два рядки використовують li (load immediate), щоб помістити константи 3 і 4 у t0 і t1. Потім рядок add залишає 7 у t2.

Приклад

li t0, 3
li t1, 4
add t2, t0, t1   # t2 = 7