sub

sub

Assembleur RISC-V Référence

lyszt.net couvre sub 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

sub soustrait la valeur d'un registre de celle d'un autre et écrit le résultat dans un troisième. Cette fonction opère sur les registres, ces petits emplacements de mémoire numérotés à l'intérieur du processeur qui contiennent chacun un nombre de 32 bits.

La syntaxe de sub est indiquée ci-dessous, et le résultat est rd = rs1 - rs2. rd est le registre de destination, où le résultat est stocké. rs1 et rs2 sont les registres sources. L’ordre est important, et l’inverser est une erreur courante chez les débutants.

sub rd, rs1, rs2

La ligne suivante calcule t0 moins t1. La source de gauche est la valeur dont on soustrait.

sub t2, t0, t1

Il n’existe pas d’instruction subi pour soustraire une constante. L’instruction addi accepte les constantes négatives ; par conséquent, soustraire un nombre fixe revient à additionner son opposé. La ligne suivante diminue la valeur de t0 d’une unité.

addi t0, t0, -1

RISC-V dispose d’un registre spécial nommé zero qui contient toujours la valeur 0. Soustraire un nombre de zero inverse son signe ; la ligne suivante place donc le négatif de t1 dans t0. L’instruction neg est un raccourci pour cela.

sub t0, zero, t1

Le manuel RISC-V définit sub comme la soustraction de rs2 de rs1. Le débordement est ignoré et seuls les bits de poids faible (XLEN) du résultat sont écrits dans rd, où XLEN correspond à la largeur du registre en bits, qui est ici de 32. Le manuel indique également que le registre x0, que ce simulateur nomme zero, est câblé à une valeur dont tous les bits sont à 0.

Dans l’exemple, 10 moins 4 donne 6 dans t2. En inversant les deux sources, on obtient -6, que le processeur stocke selon son propre schéma pour les nombres négatifs.

Exemple

li t0, 10
li t1, 4
sub t2, t0, t1   # t2 = 6