bnez
pseudolyszt.net obejmuje bnez i inne instrukcje RISC-V w większych szczegółach.
Opis
bnez wykonuje skok, gdy rejestr przechowuje wartość inną niż zero. Nazwa oznacza branch if not equal to zero (skok, jeśli nie jest równe zero). Poniższa forma skacze do etykiety, gdy rs jest różne od zera.
bnez rs, label
Asembler rozwija tę pseudoinstrukcję do poniższej instrukcji, która porównuje z rejestrem zawsze przechowującym zero.
bne rs, zero, label
Test zera opisano w beqz, a skoki ogólnie w beq.
beqz często strzeże wyjść, natomiast bnez często utrzymuje pętlę w działaniu. Dopóki pozostają znaki do odczytania, pętla kontynuuje skanowanie. Dopóki licznik się nie wyczerpał, pętla trwa. Typowa krótka pętla kończąca się dekrementuje rejestr i zapętla się, dopóki wartość jest różna od zera. Odejmuje jeden, a następnie skacze z powrotem na początek za pomocą bnez.
bnez działa również na wartościach prawda lub fałsz obliczonych wcześniej. Instrukcje takie jak slt pozostawiają 1 lub 0 w rejestrze, a następujący po nich bnez skacze na podstawie tego wyniku. Rejestr przechowujący wartość tak lub nie można sprawdzić za pomocą bnez.
Podręcznik RISC-V podaje jeden powód, dla którego jego skoki porównują dwa rejestry, a nie porównują jednego rejestru z zerem. Porównanie z zerem wymaga nietrywialnego opóźnienia układu, więc kosztuje prawie tyle samo co arytmetyczne porównanie wielkości. Dlatego bnez jest pseudoinstrukcją, która używa bne z zero.
Inne częste użycie sprawdza wyniki. Gdy funkcja zwraca 0 przy powodzeniu i wartość różną od zera przy niepowodzeniu, wywołujący po wywołaniu umieszcza poniższą linię, aby skoczyć do obsługi błędów, gdy coś poszło nie tak. To asemblerowa forma sprawdzania kodu powrotu.
bnez a0, error
Rozwija się do
bne rs, zero, label
Asembler zastępuje tę pseudoinstrukcję rzeczywistą instrukcją lub instrukcjami wymienionymi powyżej.
Przykład
li t0, 5 bnez t0, done # t0 != 0, so jump to 'done'
