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