bnez의사

bnez

의사
RISC-V 어셈블리 참조

lyszt.net은 bnez 및 기타 RISC-V 명령어를 더 자세히 다룹니다.

설명

bnez는 레지스터가 0이 아닌 값을 가질 때 분기합니다. 이 이름은 branch if not equal to zero를 의미합니다. 아래 형식은 rs가 0이 아닐 때 레이블로 점프합니다.

bnez rs, label

어셈블러는 이 의사 명령을 아래 명령으로 확장하며, 이는 항상 0을 보관하는 레지스터와 비교합니다.

bne rs, zero, label

0 검사에 대해서는 beqz를, 일반적인 분기에 대해서는 beq를 참조하세요.

beqz는 종료를 보호하는 데 자주 쓰이고, bnez는 루프를 계속 실행하는 데 자주 쓰입니다. 읽을 문자가 남아 있는 동안 루프는 계속 스캔합니다. 카운터가 다하지 않은 동안 그것은 계속 진행합니다. 흔한 짧은 루프의 끝은 레지스터를 감소시키고 값이 0이 아닌 동안 루프합니다. 1을 빼고, 그런 다음 bnez로 맨 위로 점프해 돌아갑니다.

bnez는 앞서 계산된 참 또는 거짓 값에도 작용합니다. slt와 같은 설정 명령은 레지스터에 1 또는 0을 남기고, 뒤따르는 bnez는 그 결과에 따라 분기합니다. 예 또는 아니오 값을 보관하는 레지스터는 bnez로 검사할 수 있습니다.

RISC-V 매뉴얼은 그 분기가 하나의 레지스터를 0과 비교하는 대신 두 레지스터를 비교하는 한 가지 이유를 제시합니다. 0과의 비교에는 간단하지 않은 회로 지연이 필요하므로 산술 크기 비교와 거의 같은 비용이 듭니다. 따라서 bnez는 zero와 함께 bne를 사용하는 의사 명령입니다.

또 다른 빈번한 용도는 결과를 확인하는 것입니다. 함수가 성공에 대해 0을, 실패에 대해 0이 아닌 값을 반환할 때, 호출자는 호출 뒤에 아래 줄을 두어 무언가 잘못될 때마다 오류 처리로 점프합니다. 이것은 반환 코드를 확인하는 어셈블리 형식입니다.

bnez a0, error

확장 대상

bne rs, zero, label

어셈블러는 이 의사 명령을 위에 나열된 실제 명령 또는 명령들로 대체합니다.

예시

li t0, 5
bnez t0, done   # t0 != 0, so jump to 'done'