bnez
псевдоlyszt.net охватывает bnez и другие инструкции RISC-V более подробно.
Описание
bnez выполняет переход, когда регистр содержит значение, отличное от нуля. Название означает branch if not equal to zero (переход, если не равно нулю). Приведённая ниже форма выполняет переход к метке, когда rs не равно нулю.
bnez rs, label
Ассемблер разворачивает эту псевдоинструкцию в приведённую ниже инструкцию, которая сравнивает с регистром, всегда содержащим ноль.
bne rs, zero, label
О проверке на ноль см. beqz, а о переходах в целом см. beq.
beqz часто охраняет выходы, тогда как bnez часто поддерживает выполнение цикла. Пока остаются символы для чтения, цикл продолжает сканирование. Пока счётчик не исчерпан, он продолжается. Обычный короткий цикл, завершающийся, уменьшает регистр и повторяется, пока значение не равно нулю. Он вычитает единицу, а затем выполняет переход обратно к началу с помощью bnez.
bnez также действует на значения истинности или ложности, вычисленные ранее. Инструкции вроде slt оставляют 1 или 0 в регистре, и следующий за ними bnez выполняет переход по этому результату. Регистр, содержащий значение да или нет, можно проверить с помощью bnez.
Руководство RISC-V приводит одну причину, по которой его переходы сравнивают два регистра, а не сравнивают один регистр с нулём. Сравнение с нулём требует нетривиальной задержки схемы, поэтому оно стоит почти столько же, сколько арифметическое сравнение величин. Поэтому bnez — это псевдоинструкция, использующая bne с zero.
Другое частое применение проверяет результаты. Когда функция возвращает 0 при успехе и ненулевое значение при неудаче, вызывающий после вызова добавляет приведённую ниже строку, чтобы перейти к обработке ошибок всякий раз, когда что-то пошло не так. Это ассемблерная форма проверки кода возврата.
bnez a0, error
Разворачивается в
bne rs, zero, label
Ассемблер заменяет эту псевдоинструкцию реальной инструкцией или инструкциями, перечисленными выше.
Пример
li t0, 5 bnez t0, done # t0 != 0, so jump to 'done'
