bnezpseudo

bnez

pseudo
Ensamblador RISC-V Referencia

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

Descripción

bnez salta cuando un registro contiene un valor distinto de cero. El nombre significa branch if not equal to zero (saltar si no es igual a cero). La forma siguiente salta a la etiqueta cuando rs es distinto de cero.

bnez rs, label

El ensamblador expande esta pseudoinstrucción en la instrucción siguiente, que compara con el registro que siempre contiene cero.

bne rs, zero, label

Para la prueba de cero véase beqz, y para los saltos en general véase beq.

beqz con frecuencia protege las salidas, mientras que bnez con frecuencia mantiene un bucle en ejecución. Mientras queden caracteres por leer, el bucle sigue explorando. Mientras el contador no se haya agotado, sigue adelante. Un bucle corto común que termina decrementa un registro y se repite mientras el valor es distinto de cero. Resta uno, luego salta de vuelta al inicio con bnez.

bnez también actúa sobre valores verdaderos o falsos calculados antes. Instrucciones como slt dejan un 1 o un 0 en un registro, y un bnez posterior salta según ese resultado. Un registro que contiene un valor sí o no puede probarse con bnez.

El manual de RISC-V da una razón por la que sus saltos comparan dos registros en lugar de comparar un registro con cero. Una comparación con cero necesita un retardo de circuito no trivial, por lo que cuesta casi tanto como una comparación aritmética de magnitud. Por lo tanto, bnez es una pseudoinstrucción que usa bne con zero.

Otro uso frecuente comprueba resultados. Cuando una función devuelve 0 para el éxito y distinto de cero para el fallo, el llamador sigue la llamada con la línea siguiente para saltar al manejo de errores siempre que algo haya salido mal. Esta es la forma en ensamblador de comprobar un código de retorno.

bnez a0, error

Se expande a

bne rs, zero, label

El ensamblador reemplaza esta pseudoinstrucción con la instrucción o instrucciones reales enumeradas arriba.

Ejemplo

li t0, 5
bnez t0, done   # t0 != 0, so jump to 'done'