addi

addi

Assembly RISC-V Riferimento

lyszt.net tratta addi e altre istruzioni RISC-V in modo più dettagliato.

Formato di codifica

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

Descrizione

addi aggiunge una costante a un registro. Il nome sta per add immediate (aggiungi immediato). Un immediato è un valore costante scritto nell'istruzione stessa anziché letto da un registro. Usalo quando uno dei numeri è fisso nel momento in cui scrivi il programma, come aggiungere 1 a un contatore.

La forma di addi è mostrata di seguito. Legge il valore nel registro sorgente rs1, aggiunge la costante imm e scrive il risultato nel registro di destinazione rd.

addi rd, rs1, imm

La riga successiva legge t0, aggiunge uno e riscrive il risultato, quindi t0 = t0 + 1.

addi t0, t0, 1

La costante occupa 12 bit ed è con segno, dando un intervallo da -2048 a 2047. L'assembler rifiuta i valori più grandi. Per una costante più grande, caricala prima in un registro con li. Una costante negativa fa anche sottrarre addi, ed è per questo che RISC-V non ha un'istruzione separata di sottrazione immediata. La riga successiva conta alla rovescia.

addi t0, t0, -1

Il manuale RISC-V chiama la costante un immediato a 12 bit esteso in segno. Afferma che l'overflow aritmetico viene ignorato, quindi il risultato conserva solo i suoi bit XLEN bassi, dove XLEN è la larghezza del registro in bit, qui 32. Quando il segno della costante è noto, un salto dopo l'addizione verifica l'overflow con segno. Le due righe seguenti gestiscono il caso comune di aggiungere una costante positiva.

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

I programmi usano addi per i contatori, per spostare un puntatore all'elemento successivo e per riservare spazio sullo stack. L'esempio aggiunge 1 per avanzare un contatore e aggiunge -16 per riservare 16 byte di memoria di lavoro, che è il modo in cui di solito inizia una funzione che necessita di spazio di lavoro.

Esempio

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