addi

addi

Assembleur RISC-V Référence

lyszt.net couvre addi et d'autres instructions RISC-V plus en détail.

Format d'encodage

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

Description

addi ajoute une constante à un registre. Le nom signifie add immediate (ajouter immédiat). Un immédiat est une valeur constante écrite dans l'instruction elle-même plutôt que lue depuis un registre. Utilisez-le lorsque l'un des nombres est fixe au moment où vous écrivez le programme, comme ajouter 1 à un compteur.

La forme de addi est présentée ci-dessous. Elle lit la valeur dans le registre source rs1, ajoute la constante imm et écrit le résultat dans le registre de destination rd.

addi rd, rs1, imm

La ligne suivante lit t0, ajoute un, et réécrit le résultat, donc t0 = t0 + 1.

addi t0, t0, 1

La constante occupe 12 bits et est signée, ce qui donne une plage de -2048 à 2047. L'assembleur rejette les valeurs plus grandes. Pour une constante plus grande, chargez-la d'abord dans un registre avec li. Une constante négative fait aussi soustraire addi, c'est pourquoi RISC-V n'a pas d'instruction distincte de soustraction immédiate. La ligne suivante décrémente.

addi t0, t0, -1

Le manuel RISC-V appelle la constante un immédiat de 12 bits étendu en signe. Il indique que le débordement arithmétique est ignoré, de sorte que le résultat ne conserve que ses bits XLEN de poids faible, où XLEN est la largeur du registre en bits, 32 ici. Lorsque le signe de la constante est connu, une branche après l'addition vérifie le débordement signé. Les deux lignes ci-dessous traitent le cas courant de l'ajout d'une constante positive.

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

Les programmes utilisent addi pour les compteurs, pour déplacer un pointeur vers l'élément suivant et pour réserver de l'espace sur la pile. L'exemple ajoute 1 pour avancer un compteur et ajoute -16 pour réserver 16 octets de mémoire de travail, ce qui est la façon dont commence habituellement une fonction qui a besoin d'espace de travail.

Exemple

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