bmi, bpl, bvc, bvs

이번에는 “N 플래그”, “V 플래그” 값에 따라 분기하는 니모닉이다.
bmi: minus 를 의미한다.
bpl: plus 를 의미한다.
bvc: 오버플로가 없었냐
bvs: 오버플로가 있었냐
TIP
이 명령어들은
cmp와 함께 사용되지 않는다. 일반적인 산술 연산 이후 오버플로, 음/양에 따라 점프한다.
왜 cmp와 함께 사용되지 않을까?
A < M일 때 N 플레그 가 항상 켜지지는 않는다.
예를 들어:
A=FF → A-M = $01 → N=0 (하지만 A < M 맞음)
즉, 부호 없는 비교에서 N 플래그는 신뢰할 수 없다. 따라서 CMP의 C 플래그만 봐야 한다.
조건문 작성 시도


jmp 8014
이런 “jmp”에 하드코딩이 있는 코드는 좋지 않다
ret=$80
최종 결과를 저장하는 주소
- 021. 상수, 포인터 변수 로 주소에 이름을 붙였다.

lda #NUM
“즉시 주소모드”로 NUM 값을 “A 레지스터”에 로드한다.
cmp #$05
“즉시 주소모드”로 $05와 “A 레지스터”의 NUM 값을 비교한다.
- “A 레지스터”의 값은 NUM으로 그대로다.
- “N, Z, C” 플래그만 바뀐다.
bne $800B
“Z 플래그”가 0이면 $800B(else if 블록)으로 점프한다.
- 즉 NUM이 5가 아니면 점프한다는 거죠?
- NUM이 5면 그대로 진행
lda #‘E ; $45
021. 상수, 포인터 변수에서 봤던 ASCII 리터럴을 사용했다.
- ‘E’ 는 아스키코드 69
- $45
“A 레지스터”의 값이 $45가 되겠죠?
jmp $8014
다른 분기를 건너뛰는 동작이죠? ret에 저장하는 명령어로 이동

bcs $8012
위의 “bne”로 분기해서 여기서 시작한다. 따라서 “A 레지스터”의 값은 NUM 그리고 이미 위에서 cmp 했기 때문에 플래그들이 변했겠지?
“C 플래그”가 켜졌으면 $8012로 점프한다.
- “A >= M”
- “NUM >= 5”
- 받아 내림이 적용되지 않았다.
- “NUM < 5” 를 만족하면 아래로 바로 진행한다.
- “NUM >= 5” 를 만족하면 else 블록으로 점프한다.

여기선 바로 다음줄로 가면 ret에 저장하는 코드네
cmp, bxx 니모닉이 if, else-if 문의 개수와 정확하게 비례하지는 않는다.
영상 퀴즈
만약 NUM의 값이 -5라면 코드를 실행 후 ret의 값은 무엇인가요?
ret=$80
lda #NUM
cmp #$05
bne $800B
lda #'E ; $45
jmp $8014
bcs $8012 ; 0x800B
lda #'L ; $4C
jmp $8014
lda #'G ; $47 ; 0x8012
sta ret ; 0x8014“A 레지스터”에 0b11111011이 저장 되겠지?
“cmp” 결과
0b11111011
0b00000101
빼기를 수행하면..
N 플래그: 1 Z 플래그: 0 C 플래그: 1 (받아 내림 없음)
답은 G