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