rem

rem

Assembly RISC-V Riferimento

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

rem restituisce il resto di una divisione, cioè la quantità che avanza. Dividendo 17 per 5, il 5 ci sta 3 volte con 2 che avanza. div restituisce il 3 e rem restituisce il 2. Il nome è l'abbreviazione di remainder (resto). La forma è mostrata di seguito e significa rd = il resto di rs1 diviso per rs2.

rem rd, rs1, rs2

Appartiene alla stessa estensione matematica opzionale M di div.

Le due istruzioni operano sulla stessa coppia di numeri e insieme danno il quoziente e ciò che avanza. rem è la forma assembly dell'operatore % (modulo) nei linguaggi di alto livello.

Con i numeri negativi il resto prende il segno del numero che viene diviso. 7 resto 2 fa 1, e -7 resto 2 fa -1. Un test per i numeri dispari che verifica se il resto per 2 è uguale a 1 dà la risposta sbagliata per i numeri negativi. Verificare se il resto è zero decide pari o dispari per ogni segno.

Il manuale RISC-V dice che rem fornisce il resto della divisione corrispondente e che un risultato diverso da zero ha il segno del dividendo. Ogni divisione che non va in overflow soddisfa dividendo = divisore per quoziente più resto. Un resto per zero è uguale al dividendo, e il caso di overflow con segno, il numero più negativo diviso per -1, dà un resto di zero. Per ottenere il quoziente e il resto della stessa divisione, il manuale consiglia div e poi rem sugli stessi operandi, che un processore può fondere in un'unica divisione.

I resti sono usati per riportare un contatore all'inizio di un buffer, per togliere cifre da un numero e per distribuire elementi tra gli slot. Un resto per zero restituisce il numero originale. L'esempio calcola 17 resto 5 e lascia 2 in t2.

Esempio

li t0, 17
li t1, 5
rem t2, t0, t1   # t2 = 2