add

add

Asembler RISC-V Referencja

lyszt.net obejmuje add i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

add sumuje wartości z dwóch rejestrów i zapisuje wynik w trzecim. Rejestr to mały slot wewnątrz procesora, który przechowuje pojedynczą liczbę 32-bitową. RISC-V udostępnia 32 rejestry. Bit to jedno 0 lub 1, a 32 bity obejmują liczby całkowite od 0 do około czterech miliardów. Arytmetyka odbywa się między rejestrami i nigdy nie dotyka pamięci bezpośrednio.

add ma poniższą postać, a wynikiem jest rd = rs1 + rs2. rd to rejestr docelowy, do którego trafia odpowiedź. rs1 i rs2 to rejestry źródłowe, a ich wartości pozostają takie same.

add rd, rs1, rs2

Rejestr docelowy może również służyć jako źródło. Poniższa linia dodaje t1 do t0 i umieszcza wynik z powrotem w t0. Sumy bieżące w pętlach używają tej postaci.

add t0, t0, t1

Rejestr przechowuje co najwyżej 32 bity. Gdy suma przekracza największą wartość, jaką może przechować rejestr, wynik zawija się do małej liczby, tak jak zegar 24-godzinny przechodzi z 23:59 z powrotem na 00:00. To jest przepełnienie, a RISC-V nie daje żadnego ostrzeżenia, gdy ono wystąpi.

Podręcznik RISC-V stwierdza, że żadna całkowitoliczbowa instrukcja obliczeniowa nie zgłasza wyjątku arytmetycznego oraz że podstawowy zestaw instrukcji nie zawiera sprawdzeń przepełnienia, ponieważ skoki wykonują to zadanie niskim kosztem. W przypadku dodawania bez znaku wystarczy jeden skok po add. W dwóch poniższych liniach skok przeskakuje do etykiety overflow, gdy suma jest mniejsza niż operand, co zdarza się tylko wtedy, gdy suma się zawinęła.

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

W przykładzie pierwsze dwie linie używają li (load immediate), aby umieścić stałe 3 i 4 w t0 i t1. Linia add pozostawia następnie 7 w t2.

Przykład

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