andi

andi

Ensamblador RISC-V Referencia

lyszt.net cubre andi 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

andi realiza una operación AND bit a bit con una constante. and toma dos registros, pero andi toma un registro y un inmediato, un valor fijo codificado en la instrucción. La i significa inmediato. La regla de AND no cambia: un bit del resultado es 1 solo cuando ambos bits de entrada son 1, por lo que la constante actúa como una máscara que conserva algunos bits y borra los demás. El enmascaramiento y las operaciones bit a bit se tratan en la página de and.

La forma de andi se muestra a continuación. Realiza la operación AND del valor en rs1 con la constante imm y escribe el resultado en rd.

andi rd, rs1, imm

Úsala cuando sepas de antemano qué bits conservar. La siguiente línea conserva los 8 bits más bajos de t0 y borra los 24 superiores, extrayendo un byte de un valor mayor. El prefijo 0x marca una constante hexadecimal.

andi t1, t0, 0xff

La constante debe caber en 12 bits, por lo que no puede expresar una máscara amplia. Para una máscara mayor, cárgala en un registro con li y usa and.

El manual de RISC-V dice que el inmediato de 12 bits se extiende con signo a 32 bits antes de la operación, por lo que una constante negativa tiene todos sus bits superiores establecidos. andi, ori y xori realizan la operación bit a bit sobre el registro rs1 y ese valor extendido y colocan el resultado en rd.

A continuación se presentan dos usos comunes. La primera línea conserva solo el bit más bajo, que es 1 para números impares y 0 para números pares. La segunda línea da el resto después de dividir por 8, porque un resto sin signo por una potencia de dos son los bits más bajos.

andi t1, t0, 1
andi t1, t0, 7

Ejemplo

andi t1, t0, 0xff   # keep only the low byte