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'