bnezpseudo

bnez

pseudo
Assembleur RISC-V Référence

lyszt.net couvre bnez et d'autres instructions RISC-V plus en détail.

Description

bnez effectue un branchement lorsqu'un registre contient une valeur différente de zéro. Le nom signifie branch if not equal to zero. La forme ci-dessous saute vers l'étiquette lorsque rs est non nul.

bnez rs, label

L'assembleur développe cette pseudo-instruction en l'instruction ci-dessous, qui compare avec le registre qui contient toujours zéro.

bne rs, zero, label

Pour le test de zéro voir beqz, et pour les branchements en général voir beq.

beqz garde fréquemment les sorties, tandis que bnez maintient fréquemment une boucle en cours. Tant qu'il reste des caractères à lire, la boucle continue de balayer. Tant que le compteur n'est pas épuisé, elle continue. Une fin de boucle courte courante décrémente un registre et boucle tant que la valeur est non nulle. Elle soustrait un, puis saute en arrière vers le haut avec bnez.

bnez agit aussi sur des valeurs vraies ou fausses calculées plus tôt. Les instructions de définition telles que slt laissent un 1 ou un 0 dans un registre, et un bnez suivant effectue un branchement sur ce résultat. Un registre contenant une valeur oui ou non peut être testé avec bnez.

Le manuel RISC-V donne une raison pour laquelle ses branchements comparent deux registres plutôt qu'un registre à zéro. Une comparaison à zéro nécessite un délai de circuit non trivial, donc elle coûte presque autant qu'une comparaison de magnitude arithmétique. bnez est donc une pseudo-instruction qui utilise bne avec zero.

Un autre usage fréquent vérifie les résultats. Lorsqu'une fonction renvoie 0 pour le succès et non zéro pour l'échec, l'appelant fait suivre l'appel de la ligne ci-dessous pour sauter vers la gestion d'erreur chaque fois que quelque chose s'est mal passé. C'est la forme assembleur de la vérification d'un code de retour.

bnez a0, error

Se développe en

bne rs, zero, label

L'assembleur remplace cette pseudo-instruction par la ou les instructions réelles listées ci-dessus.

Exemple

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