sub

sub

Ensamblador RISC-V Referencia

lyszt.net cubre sub y otras instrucciones RISC-V con más detalle.

Formato de codificación

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

Descripción

sub resta el valor de un registro del de otro y escribe el resultado en un tercero. Funciona con registros, es decir, las pequeñas ranuras de almacenamiento numeradas del interior del procesador que contienen cada una un número de 32 bits.

A continuación se muestra la sintaxis de sub; el resultado es rd = rs1 - rs2. rd es el registro de destino, donde se almacena el resultado. rs1 y rs2 son los registros de origen. El orden es importante, y invertirlo es un error habitual entre los principiantes.

sub rd, rs1, rs2

La siguiente línea calcula t0 menos t1. La fuente de la izquierda es el valor del que se resta.

sub t2, t0, t1

No existe una instrucción subi para restar una constante. La instrucción addi admite constantes negativas, por lo que restar un número fijo equivale a sumar su valor negativo. La siguiente línea reduce el valor de t0 en uno.

addi t0, t0, -1

RISC-V cuenta con un registro especial denominado zero que siempre contiene el valor 0. Restar un número de zero invierte su signo, por lo que la siguiente línea asigna el valor negativo de t1 a t0. La instrucción neg es una forma abreviada de hacerlo.

sub t0, zero, t1

El manual de RISC-V define sub como la resta de rs2 de rs1. Se ignora el desbordamiento y solo se escriben en rd los bits inferiores de XLEN del resultado, donde XLEN es el ancho del registro en bits, que en este caso es 32. El manual también indica que el registro x0, al que este simulador denomina zero, está preconfigurado con un valor en el que todos los bits son 0.

En el ejemplo, 10 menos 4 da como resultado 6 en t2. Al intercambiar las dos fuentes se obtiene -6, que el procesador almacena según su propio esquema para números negativos.

Ejemplo

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