bne

bne

Ensamblador RISC-V Referencia

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

bne significa branch if not equal (salta si no es igual), y es la contraparte de beq. Compara dos registros y salta a la posición etiquetada cuando difieren. Cuando coinciden, la ejecución continúa con la siguiente instrucción. La forma se muestra a continuación. Los saltos, las etiquetas y el salto condicional se explican en la página de beq.

bne rs1, rs2, label

Juntas, beq y bne cubren toda decisión de igualdad y desigualdad. El ensamblador a menudo enuncia una condición en forma invertida. Para ejecutar un bloque de código solo cuando dos valores son iguales, salta alrededor de ese bloque con bne. El código omite el bloque cuando los valores difieren y entra en él cuando coinciden.

bne también mantiene un bucle en marcha mientras se cumple una condición. Un bucle que se ejecuta hasta que un valor alcanza un objetivo termina con un bne que salta de vuelta al inicio. La lectura de texto sigue este patrón, donde el bucle continúa mientras el carácter actual no sea el byte cero que marca el final.

El manual de RISC-V dice que beq y bne toman el salto cuando los registros rs1 y rs2 son iguales o desiguales. El desplazamiento es un valor de 12 bits contado en múltiplos de 2 bytes, por lo que un salto alcanza unos 4 KiB en cualquier dirección, donde un KiB son 1024 bytes.

bnez es la forma abreviada de comparar con cero, que pregunta si un valor no es cero. La comparación en bne, como en beq, es una igualdad simple de bits, por lo que las lecturas con signo y sin signo no importan.

Ejemplo

li t0, 1
li t1, 2
bne t0, t1, done   # t0 != t1, so jump to 'done'