bnez
pseudolyszt.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'
