rem
lyszt.net tratta rem e altre istruzioni RISC-V in modo più dettagliato.
Formato di codifica
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
