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 플래그는 신뢰할 수 없다. 따라서 CMPC 플래그만 봐야 한다.

조건문 작성 시도

jmp 8014

이런 “jmp”에 하드코딩이 있는 코드는 좋지 않다

ret=$80

최종 결과를 저장하는 주소

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

005. cmp의 판단 기준 참고