bne

bne

Асемблер RISC-V Посилання

lyszt.net охоплює bne та інші інструкції RISC-V більш детально.

Формат кодування

R
31–25funct7
24–20rs2
19–15rs1
14–12funct3
11–7rd
6–0opcode
I
31–20imm[11:0]
19–15rs1
14–12funct3
11–7rd
6–0opcode
S
31–25imm[11:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:0]
6–0opcode
B
31–25imm[12,10:5]
24–20rs2
19–15rs1
14–12funct3
11–7imm[4:1,11]
6–0opcode
U
31–12imm[31:12]
11–7rd
6–0opcode
J
31–12imm[20,10:1,11,19:12]
11–7rd
6–0opcode

Опис

bne означає branch if not equal (перехід, якщо не дорівнює) і є відповідником beq. Він порівнює два регістри й переходить до позначеної позиції, коли вони різняться. Коли вони збігаються, виконання продовжується з наступною інструкцією. Форму показано нижче. Переходи, мітки та перехід за умовою пояснюються на сторінці beq.

bne rs1, rs2, label

Разом beq і bne охоплюють кожне рішення про рівність і нерівність. Асемблер часто формулює умову в інвертованій формі. Щоб виконати блок коду лише тоді, коли два значення рівні, обійдіть цей блок за допомогою bne. Код пропускає блок, коли значення різняться, і входить у нього, коли вони збігаються.

bne також підтримує цикл, поки умова виконується. Цикл, який виконується доти, доки значення не досягне цілі, завершується bne, що переходить назад до початку. Читання тексту дотримується цього шаблону, де цикл триває, поки поточний символ не є нульовим байтом, що позначає кінець.

Посібник RISC-V каже, що beq і bne виконують перехід, коли регістри rs1 і rs2 рівні або нерівні. Зсув — це 12-бітне значення, яке відраховується кратними 2 байтами, тому перехід сягає приблизно 4 KiB в будь-якому напрямку, де KiB — це 1024 байти.

bnez — це скорочення для порівняння з нулем, яке запитує, чи значення не дорівнює нулю. Порівняння в bne, як і в beq, — це звичайна рівність бітів, тому знакова та беззнакова інтерпретації не мають значення.

Приклад

li t0, 1
li t1, 2
bne t0, t1, done   # t0 != t1, so jump to 'done'