bnezpseudo

bnez

pseudo
Asembler RISC-V Referencja

lyszt.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'