bne

bne

Asembler RISC-V Referencja

lyszt.net obejmuje bne i inne instrukcje RISC-V w większych szczegółach.

Format kodowania

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

Opis

bne oznacza branch if not equal (skok, jeśli nie są równe) i jest odpowiednikiem beq. Porównuje dwa rejestry i skacze do oznaczonej pozycji, gdy się różnią. Gdy są równe, wykonanie przechodzi do następnej instrukcji. Postać pokazano poniżej. Skoki, etykiety i skakanie po warunku wyjaśniono na stronie beq.

bne rs1, rs2, label

Razem beq i bne obsługują każdą decyzję o równości i nierówności. Asembler często podaje warunek w odwróconej formie. Aby wykonać blok kodu tylko wtedy, gdy dwie wartości są równe, przeskocz wokół tego bloku za pomocą bne. Kod pomija blok, gdy wartości się różnią, a wchodzi do niego, gdy są równe.

bne podtrzymuje też pętlę, dopóki warunek jest spełniony. Pętla, która działa, aż wartość osiągnie cel, kończy się bne, które skacze z powrotem na początek. Czytanie tekstu przebiega według tego wzorca, gdzie pętla trwa, dopóki bieżący znak nie jest bajtem zerowym oznaczającym koniec.

Podręcznik RISC-V mówi, że beq i bne wykonują skok, gdy rejestry rs1 i rs2 są równe lub nierówne. Przesunięcie to wartość 12-bitowa liczona w wielokrotnościach 2 bajtów, więc skok sięga około 4 KiB w każdym kierunku, gdzie KiB to 1024 bajty.

bnez to skrót oznaczający porównanie z zerem, które pyta, czy wartość nie jest zerem. Porównanie w bne, podobnie jak w beq, to zwykła równość bitów, więc interpretacja ze znakiem i bez znaku nie ma znaczenia.

Przykład

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