nemónico | nombre | ejemplo | explicación |
---|---|---|---|
add | + | add x8 , x7 , x6 | x8 = x7 + x6 |
sub | - | sub x8 , x7 , x6 | x8 = x7 - x6 |
addi | + inmediata | addi x8 , x7 , 3 | x8 = x7 + 3 |
lui | load upper inmediate | lui x8 , 43 | escribe un número en los 20 bits de mayor peso o dicho de otra manera introduce el valor y lo multiplica por $2^{11}$ |
auipc | add upper inmediate to pc inmediata | auipc x8 , 0xff | lo mismo que lui pero desde una referencia |
La realización de la resta inmediata no existe porque es lo mismo que sumar el opuesto (restar 3 es lo mismo que sumar -3) de este modo nos ahorramos una instrucción.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
and | y | and x8 , x7 , x6 | x8=(x7&x6) |
andi | y inmediato | andi x8 , x7 , 15 | x8=(x7&15) |
or | o | or x8 , x7 , x6 | x8=(x7|x6) |
ori | o inmediata | ori x8 , x7 , 15 | x8=(x7|15) |
xor | o excluyente | xor x8 , x7 , x6 | x8=(x7^x6) |
xori | o excluyente inmediata | xori x8 , x7 , 15 | x8=(x7^15) |
La realización de la resta inmediata no existe porque es lo mismo que sumar el opuesto (restar 3 es lo mismo que sumar -3) de este modo nos ahorramos una instrucción.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
sll | desplazamiento a izquierda lógico | and x8 , x7 , x6 | x8 = x7 << x6 |
slli | desplazamiento a izquierda lógico inmediato | andi x8 , x7 , 3 | x8= x7 << 3 |
srl | desplazamiento a la derecha lógico | srl x8 , x7 , x6 | x8= x7 >> x6 |
srli | desplazamiento a la derecha lógico inmediato | srl x8 , x7 , 3 | x8= x7 >> 3 |
sra | desplazamiento a la derecha aritmético | srl x8 , x7 , x6 | |
srai | desplazamiento a la derecha aritmético inmediato | srl x8 , x7 , 3 |
Para el caso de los registros a derechas hay dos formas de hacerlos, poniendo 0 en las casillas libres (este es el modelo lógico) o poniendo lo que se haya en la última casillas que se desplaza , en el caso de que sea un 1 pues será un 1 y en el caso de que sea un 0 pues este.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
lw | cargar palabra | lw x10 , 15(x11) | carga en el registro x10 la palabra que se encuentra en la memoria con dirección (la almacenada en x11 ) más 15 bytes. |
lh | cargar media palabra | lh x10 , 15(x11) | carga en el registro x10 la media palabra que se encuentra en la memoria con dirección (la almacenada en x11 ) más 15 bytes. |
lb | cargar el byte | lb x10 , 15(x11) | carga en el registro x10 el byte que se encuentra en la memoria con dirección (la almacenada en x11 ) más 15 bytes. |
lhu | cargar media palabra sin signo | lhu x10 , 15(x11) | carga en el registro x10 la media palabra que se encuentra en la memoria y lo espande como un valor positivo con dirección (la almacenada en x11 ) más 15 bytes. |
lbu | cargar el byte sin signo | lb x10 , 15(x11) | carga en el registro x10 el byte que se encuentra en la memoria (considerandolo como positivo) con dirección (la almacenada en x11 ) más 15 bytes. |
sw | guardar palabra | sw x10 , 15(x11) | guarda el contenido del registro x10 en (la dirección que almacena el x11) más 15 bytes |
sh | guardar media palabra | sh x10 , 15(x11) | guarda el contenido de medio registro x10 en (la dirección que almacena el x11) más 15 bytes |
sb | guardar byte | sb x10 , 15(x11) | guarda el contenido del byte x10 en (la dirección que almacena el x11) más 15 bytes |
Cuando decimos que se guarda en la dirección almacenada en x11 más 15 bytes en realidad queremos decir en la dirección almacenada en x11 más (15 * 8) ya que un byte ocupa 8 bits.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
jal | salto | jal x10 , 4 | va a la dirección guardada en x10 + 4. |
jalu | salto al registro | jal x10 , 4 | va a la dirección guardada en x10 + 4. |
beq | salta si son iguales | beq x10 , x11, eti | va a eti si x10 y x11 son iguales. |
bne | salta si no son iguales | bne x10 , x11, eti | va a eti si x10 y x11 no son iguales. |
bge | salta si es mayor o igual | bge x10 , x11, eti | va a eti si x10 y x11 es >=. |
bgeu | salta si es mayor o igual (no se consideran negativos) | bge x10 , x11, eti | va a eti si x10 y x11 es >=. |
blt | salta si es menor que | blt x10 , x11, eti | va a eti si x10 y x11 es <. |
bltu | salta si es menor (no se consideran negativos) | bge x10 , x11, eti | va a eti si x10 y x11 es <. |
Cuando decimos que se guarda en la dirección almacenada en x11 más 15 bytes en realidad queremos decir en la dirección almacenada en x11 más (15 * 8) ya que un byte ocupa 8 bits.
Se puede ver que es general el uso de la terminación u para referirnos a que los registros solo hacen referencia a números positivos.
Si existe mayor o igual no existe la instrucción menor o igual ya que es lo mismo pero cambiada de orden.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
ecall | llamada al sistema | ecall | llama al sistema |
ebreak | llamada al sistema | ebreak | pasa el control al debug |
Llamar al sistema no es una acción como las otras, más bien es una función, cuya acción dependerá tanto del sistema como de los parámetros que se le envien.
No todos los sistemas tienen el mismo conjunto de acciones, no es lo mismo una maquina de trabajo con acciones con entrada y salida de datos que recibe de una persona física como un sistema empotrado que se dedica a medir una temperatura y posiblemente no tenga ninguna opción de llamada.
nemónico | nombre | ejemplo | explicación |
---|---|---|---|
frece | Coordina accesos entre dispositivos I/O y otros hilos. | ||
frece.i | Sincroniza el flujo de instrucción de datos. |
Llamar al sistema no es una acción como las otras, más bien es una función, cuya acción dependerá tanto del sistema como de los parámetros que se le envien.
No todos los sistemas tienen el mismo conjunto de acciones, no es lo mismo una maquina de trabajo con acciones con entrada y salida de datos que recibe de una persona física como un sistema empotrado que se dedica a medir una temperatura y posiblemente no tenga ninguna opción de llamada.