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로 끝납니다. 텍스트 읽기는 이 패턴을 따르며, 여기서 루프는 현재 문자가 끝을 표시하는 0바이트가 아닌 동안 계속됩니다.

RISC-V 매뉴얼에 따르면 beq와 bne는 레지스터 rs1과 rs2가 같거나 다를 때 분기를 수행합니다. 오프셋은 2바이트의 배수로 계산되는 12비트 값이므로, 분기는 어느 방향으로든 약 4 KiB에 도달하며, 여기서 1 KiB는 1024바이트입니다.

bnez는 0과 비교하는 축약형으로, 값이 0이 아닌지를 묻습니다. bne의 비교는 beq에서와 마찬가지로 비트의 단순한 동등성이므로 부호 있는 해석과 부호 없는 해석은 중요하지 않습니다.

예시

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