addi

addi

Assembly RISC-V Referência

lyszt.net aborda addi 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

addi adiciona uma constante a um registrador. O nome significa add immediate (adicionar imediato). Um imediato é um valor constante escrito na própria instrução em vez de lido de um registrador. Use-o quando um dos números é fixo no momento em que você escreve o programa, como adicionar 1 a um contador.

A forma de addi é mostrada abaixo. Ela lê o valor no registrador de origem rs1, adiciona a constante imm e escreve o resultado no registrador de destino rd.

addi rd, rs1, imm

A linha seguinte lê t0, adiciona um e escreve o resultado de volta, então t0 = t0 + 1.

addi t0, t0, 1

A constante ocupa 12 bits e é com sinal, dando um intervalo de -2048 a 2047. O montador rejeita valores maiores. Para uma constante maior, carregue-a em um registrador com li primeiro. Uma constante negativa faz addi subtrair também, e é por isso que o RISC-V não tem uma instrução separada de subtração imediata. A linha seguinte faz a contagem regressiva.

addi t0, t0, -1

O manual do RISC-V chama a constante de imediato de 12 bits com extensão de sinal. Ele afirma que o estouro aritmético é ignorado, então o resultado mantém apenas seus bits XLEN de ordem inferior, onde XLEN é a largura do registrador em bits, 32 aqui. Quando o sinal da constante é conhecido, um desvio após a adição verifica estouro com sinal. As duas linhas abaixo tratam o caso comum de adicionar uma constante positiva.

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

Os programas usam addi para contadores, para mover um ponteiro para o próximo item e para reservar espaço na pilha. O exemplo adiciona 1 para avançar um contador e adiciona -16 para reservar 16 bytes de memória de trabalho, que é como uma função que precisa de espaço de trabalho geralmente começa.

Exemplo

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