add

add

Assembly RISC-V Referência

lyszt.net aborda add e outras instruções RISC-V com mais detalhes.

Formato de codificação

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

Descrição

add soma os valores em dois registradores e armazena o resultado em um terceiro. Um registrador é um pequeno espaço dentro do processador que contém um único número de 32 bits. O RISC-V fornece 32 registradores. Um bit é um 0 ou 1, e 32 bits cobrem números inteiros de 0 até aproximadamente quatro bilhões. A aritmética ocorre entre registradores e nunca toca a memória diretamente.

add tem a forma abaixo, e o resultado é rd = rs1 + rs2. rd é o registrador de destino, onde a resposta vai. rs1 e rs2 são os registradores de origem, e seus valores permanecem os mesmos.

add rd, rs1, rs2

O destino também pode servir como origem. A linha abaixo soma t1 a t0 e coloca o resultado de volta em t0. Totais acumulados em laços usam essa forma.

add t0, t0, t1

Um registrador contém no máximo 32 bits. Quando uma soma excede o maior valor que um registrador pode conter, o resultado volta para um número pequeno, como um relógio de 24 horas que vai de 23:59 de volta para 00:00. Isso é overflow, e o RISC-V não dá nenhum aviso quando isso ocorre.

O manual do RISC-V afirma que nenhuma instrução de computação inteira gera uma exceção aritmética, e que o conjunto de instruções base não faz verificações de overflow porque os desvios cuidam disso a baixo custo. Para a adição sem sinal, um único desvio após o add é suficiente. Nas duas linhas abaixo, o desvio salta para o rótulo overflow quando a soma é menor que um operando, o que só acontece se a soma deu a volta.

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

No exemplo, as duas primeiras linhas usam li (load immediate) para colocar as constantes 3 e 4 em t0 e t1. A linha add então deixa 7 em t2.

Exemplo

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