bne
lyszt.net aborda bne e outras instruções RISC-V com mais detalhes.
Formato de codificação
Descrição
bne significa branch if not equal (desviar se diferente), e é a contraparte de beq. Ele compara dois registradores e salta para a posição rotulada quando eles diferem. Quando são iguais, a execução continua com a próxima instrução. A forma é mostrada abaixo. Desvios, rótulos e salto condicional são explicados na página do beq.
bne rs1, rs2, label
Juntos, beq e bne tratam toda decisão de igual ou diferente. Em assembly, muitas vezes uma condição é expressa na forma invertida. Para executar um bloco de código apenas quando dois valores são iguais, desvie ao redor desse bloco com bne. O código pula o bloco quando os valores diferem e entra nele quando são iguais.
bne também mantém um laço em execução enquanto uma condição for verdadeira. Um laço que roda até um valor atingir um alvo termina com um bne que salta de volta ao topo. A leitura de texto segue esse padrão, em que o laço continua enquanto o caractere atual não for o byte zero que marca o fim.
O manual do RISC-V diz que beq e bne realizam o desvio quando os registradores rs1 e rs2 são iguais ou diferentes. O deslocamento é um valor de 12 bits contado em múltiplos de 2 bytes, então um desvio alcança cerca de 4 KiB em qualquer direção, onde um KiB é 1024 bytes.
bnez é a forma abreviada para comparar com zero, que pergunta se um valor é diferente de zero. A comparação em bne, assim como em beq, é uma simples igualdade de bits, então leituras com sinal e sem sinal não importam.
Exemplo
li t0, 1 li t1, 2 bne t0, t1, done # t0 != t1, so jump to 'done'
