bnezpseudo

bnez

pseudo
Assembly RISC-V Referência

lyszt.net aborda bnez e outras instruções RISC-V com mais detalhes.

Descrição

bnez desvia quando um registrador contém um valor diferente de zero. O nome significa branch if not equal to zero. A forma abaixo salta para o rótulo quando rs é diferente de zero.

bnez rs, label

O montador expande esta pseudo-instrução na instrução abaixo, que compara com o registrador que sempre contém zero.

bne rs, zero, label

Para o teste de zero veja beqz, e para desvios em geral veja beq.

beqz frequentemente protege saídas, enquanto bnez frequentemente mantém um laço em execução. Enquanto restam caracteres a serem lidos, o laço continua varrendo. Enquanto o contador não se esgotou, ele continua. Um final de laço curto comum decrementa um registrador e faz o laço enquanto o valor é diferente de zero. Ele subtrai um, então salta de volta para o topo com bnez.

bnez também age sobre valores verdadeiros ou falsos calculados anteriormente. Instruções de definição como slt deixam um 1 ou 0 em um registrador, e um bnez seguinte desvia com base nesse resultado. Um registrador contendo um valor sim ou não pode ser testado com bnez.

O manual do RISC-V dá uma razão pela qual seus desvios comparam dois registradores em vez de comparar um registrador com zero. Uma comparação com zero precisa de um atraso de circuito não trivial, então custa quase tanto quanto uma comparação de magnitude aritmética. bnez é, portanto, uma pseudo-instrução que usa bne com zero.

Outro uso frequente verifica resultados. Quando uma função retorna 0 para sucesso e diferente de zero para falha, o chamador segue a chamada com a linha abaixo para saltar para o tratamento de erro sempre que algo deu errado. Esta é a forma em assembly de verificar um código de retorno.

bnez a0, error

Expande para

bne rs, zero, label

O montador substitui esta pseudoinstrução pela instrução ou instruções reais listadas acima.

Exemplo

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