sub

sub

Assembly RISC-V Riferimento

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

sub sottrae il valore contenuto in un registro da quello contenuto in un altro e scrive il risultato in un terzo registro. Opera sui registri, ovvero le piccole aree di memoria numerate all’interno del processore, ciascuna delle quali contiene un numero a 32 bit.

La sintassi di sub è mostrata di seguito e il risultato è rd = rs1 - rs2. rd è il registro di destinazione, dove viene salvato il risultato. rs1 e rs2 sono i registri sorgente. L’ordine è importante e invertirlo è un errore comune tra i principianti.

sub rd, rs1, rs2

La riga successiva calcola t0 meno t1. La sorgente a sinistra è il valore da cui viene sottratto.

sub t2, t0, t1

Non esiste un'istruzione subi per sottrarre una costante. L'istruzione addi accetta costanti negative, quindi sottrarre un numero fisso significa sommare il suo opposto. La riga successiva riduce il valore di t0 di uno.

addi t0, t0, -1

RISC-V dispone di un registro speciale denominato zero che contiene sempre il valore 0. Sottraendo un numero da zero se ne inverte il segno, quindi la riga successiva assegna il valore negativo di t1 a t0. L’istruzione neg è una scorciatoia per questa operazione.

sub t0, zero, t1

Il manuale di RISC-V definisce sub come la sottrazione di rs2 da rs1. L’overflow viene ignorato e solo i bit meno significativi (XLEN) del risultato vengono scritti in rd, dove XLEN è la larghezza del registro in bit, che in questo caso è 32. Il manuale indica inoltre che il registro x0, denominato zero in questo simulatore, è preimpostato su un valore con tutti i bit a 0.

Nell’esempio, 10 meno 4 dà come risultato 6 in t2. Scambiando le due sorgenti si ottiene -6, che il processore memorizza secondo il proprio schema per i numeri negativi.

Esempio

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