rem
lyszt.net cubre rem y otras instrucciones RISC-V con más detalle.
Formato de codificación
Descripción
rem devuelve el resto de una división, es decir, la cantidad que sobra. Al dividir 17 entre 5, cabe 3 veces y sobran 2. div devuelve el 3 y rem devuelve el 2. El nombre es la abreviatura de «remainder» (resto). La sintaxis se muestra a continuación y significa que rd = el resto de la división de rs1 entre rs2.
rem rd, rs1, rs2
Pertenece a la misma extensión matemática opcional M que div.
Las dos instrucciones operan sobre el mismo par de números y, juntas, dan el cociente y el resto. rem es la forma en ensamblador del operador % (módulo) de los lenguajes de alto nivel.
Con números negativos, el resto toma el signo del número que se divide. El resto de 7 dividido por 2 es 1, y el resto de -7 dividido por 2 es -1. Una prueba para números impares que comprueba si el resto de la división por 2 es igual a 1 da una respuesta errónea para los números negativos. Comprobar si el resto es cero permite determinar si el número es par o impar, independientemente de su signo.
El manual de RISC-V indica que rem proporciona el resto de la división correspondiente y que un resultado distinto de cero tiene el signo del dividendo. Toda división que no provoque desbordamiento cumple que dividendo = divisor por cociente más resto. Un resto de la división por cero es igual al dividendo, y el caso de desbordamiento con signo, el número más negativo dividido por -1, da un resto igual a cero. Para obtener el cociente y el resto de la misma división, el manual recomienda utilizar div y, a continuación, rem sobre los mismos operandos, lo que un procesador puede fusionar en una única división.
Los restos se utilizan para hacer que un contador vuelva al inicio de un búfer, para eliminar dígitos de un número y para distribuir elementos entre las ranuras. Un resto por cero devuelve el número original. El ejemplo calcula 17 con resto 5 y deja 2 en t2.
Ejemplo
li t0, 17 li t1, 5 rem t2, t0, t1 # t2 = 2
