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'
