Skip to the content.

B 명령어 (Conditional Branch)

Summary

정의: 조건 플래그(NZCV) 상태에 따라 분기 여부를 결정하는 명령어 그룹. CMP, CMN, TST 등으로 플래그를 설정한 후 사용하는 것이 일반적 패턴임.

기본 문법:

B{cond} label

조건 코드 전체 목록

무조건 분기

니모닉 조건 설명
B 없음 무조건 분기

부호 있는 비교 (Signed)

니모닉 조건 플래그 조건 의미
B.EQ Equal Z==1 같음
B.NE Not Equal Z==0 같지 않음
B.GT Greater Than Z==0 && N==V 초과 (부호 있는)
B.GE Greater or Equal N==V 이상 (부호 있는)
B.LT Less Than N!=V 미만 (부호 있는)
B.LE Less or Equal Z==1 || N!=V 이하 (부호 있는)

부호 없는 비교 (Unsigned)

니모닉 조건 플래그 조건 의미
B.HI Higher C==1 && Z==0 초과 (부호 없는)
B.HS Higher or Same C==1 이상 (부호 없는), B.CS와 동일
B.LO Lower C==0 미만 (부호 없는), B.CC와 동일
B.LS Lower or Same C==0 || Z==1 이하 (부호 없는)

추가 조건 코드 (자주 누락되는 항목)

니모닉 조건 플래그 조건 의미
B.MI Minus N==1 음수
B.PL Plus N==0 양수 또는 0
B.VS Overflow Set V==1 오버플로우 발생
B.VC Overflow Clear V==0 오버플로우 없음
B.CS Carry Set C==1 캐리 발생, B.HS와 동일
B.CC Carry Clear C==0 캐리 없음, B.LO와 동일
B.AL Always 없음 항상 분기 (B와 동일, 명시적 표기용)

부호 있는 vs 부호 없는 구분 기준

핵심 원칙: 동일한 대소 비교라도 데이터 타입에 따라 다른 니모닉 사용 필요.

구분 부호 있는 (signed) 부호 없는 (unsigned)
초과 GT HI
이상 GE HS
미만 LT LO
이하 LE LS

판단 근거: 부호 있는 비교는 N(Negative)과 V(Overflow) 플래그 조합으로 판단하고, 부호 없는 비교는 C(Carry) 플래그 단독으로 판단함. 이는 오버플로우 발생 시 부호 비트 해석이 달라지기 때문임.


예제 코드

.global _start
.align 2

.text
_start:
    mov x0, #10
    mov x1, #20

    cmp x0, x1          // x0 - x1 연산, 플래그 설정
    b.lt less_branch     // x0 < x1 (signed) 이면 분기

    mov x2, #0
    b   end

less_branch:
    mov x2, #1

end:
    mov x0, #0
    mov x16, #1
    svc #0x80

동작 설명: CMP x0, x1은 내부적으로 x0 - x1 연산을 수행하여 NZCV 플래그를 설정함. 이후 B.LT는 해당 플래그를 검사하여 x0가 x1보다 작은 경우(signed 기준) less_branch 라벨로 분기함.


플래그 설정 명령어와의 관계

명령어 동작 용도
CMP 뺄셈 후 결과 버림, 플래그만 설정 대소 비교
CMN 덧셈 후 결과 버림, 플래그만 설정 음수 비교
TST AND 연산 후 결과 버림, 플래그만 설정 비트 검사

이 명령어들이 선행되지 않으면 조건부 분기의 플래그 상태가 이전 산술/논리 연산 결과에 의존하게 되므로, 의도치 않은 분기가 발생할 수 있음. 조건부 분기 사용 시 직전 플래그 설정 명령어 확인이 필수적임.