signed 비교 방법 2

sbc를 사용하여 A - M을 계산

“sbc”를 사용한 이유는 “V 플래그”를 바꾸기 때문이다.

signed 뺄셈의 가능한 조합

“양수 - 양수”, “음수 - 음수” >> 절대 오버플로 안나죠?

sbc 에서 “sbc”의 동작을 확인해볼까??

V 플래그: signed 오버플로가 발생하면 켜짐

  • 결과가 [-128, 127] 범위를 넘어서면 켜짐

양수 중에 가장 작은 수는 0x00000000, 이 값이 “A 레지스터”의 값이라고 간주하자. 양수 중에 가장 큰 수는 0x01111111, 이 값이 M(피연산자)의 값이라고 간주하자.

직관적으로 그냥 빼도 -127이라 [-128, 127]의 범위를 벗어나지 않았다.

“오버플로우 플래그”의 정의를 적용해보자.

“sbc”를 수행하면 다음과 같다.

  1. “캐리 플래그”는 1로 시작
  2. “M의 부호를 뒤집음”
    • 0x1000_0000
  3. 뒤집힌 M에 “캐리 플래그” 값을 더함
    • 0x1000_0001
  4. A와 더함
    • 0x1000_0001
    • “캐리 플래그”는 0이된다.
      • 받아 내림이 있었다는 의미

결과의 부호가 입력의 부호와 다르고 A 레지스터의 부호와 다를 때

“A 레지스터”의 부호는 양수, M의 부호는 양수로 보이나 사실은 여기서 입력은 “-M”(M의 2의 보수, 뒤집힌 M에 캐리 플래그를 더한 비트 패턴) 이라서 음수다! 따라서 두 입력의 부호가 달라서 오버플로우가 발생하지 않는다!

간단하게 채우고

양수 - 음수 오버플로

양수 + 양수로 오버플로니까 음수가 되죠? “N 플래그”는 켜진다.

양수 + 양수로 정상이면(오버플로 X) 양수겠네, “N 플래그”는 켜지지 않는다.

음수 - 양수 오버플로

음수 + 음수로 오버플로가 나면 양수가 되죠? “N 플래그”는 켜지지 않는다.

정상이면 음수니까 “N 플래그”는 켜진다.

매핑 확인

빨간색으로 하이라이트 한 연산이 진짜 “A < M” 인지 확인해보자.

  • 숫자 대입해서 넣어보면 된다

양수 - 양수가 음수인 경우

5 - 10

A < M 성립

음수 - 음수가 음수인 경우

-5 - -3

A < M 성립

음수 - 양수가 오버플로우 나는 경우

-100 - 50

  • -128 보다 작아서 오버플로우

A < M 성립

음수 - 양수가 정상인 경우

-100 - 27

A < M 성립

빨간색 하이라이트 안 된 경우

이것도 숫자 넣어서 해보면 됩니다.

signed 뺄셈의 가능한 조합 표를 만들어 이해할 수 있어야 한다.

N XOR V를 하는 방법

“V 플래그”를 피연산자로 가져와서 XOR 연산에 사용할 방법이 없다.

sbc를 사용해 A - M을 계산

결과가 “A 레지스터”에 저장되기 때문에 A의 “bit 7”이 바로 N 플래그 값이다.

V 플래그가 켜져 있다면

004. 고수준 조건문 옮기기 에서 본 “bvc”, “bvs”를 사용하자

“V 1" 이면 "bvs"(Branch Overflow Set) 지만, 반대로 해야하니 "bvc"(Branch Overflow Clear), "V 1”을 만족하면 바로 밑의 “eor #$80” 실행

eor #$80

“A 레지스터”의 “bit 7”(N 플래그 값)과 1(V == 1 이라서 V의 역할을 한다)을 xor 하는 거죠? 결과 비트는 “A 레지스터”에 저장된다.

  • 020. 논리 연산 참고
  • “A 레지스터”의 “bit 7”이 “N XOR V”의 값
  • eor 결과 “bit 7”의 값은 “N 플래그”를 결정하죠?
  • 따라서 “N XOR V”의 값이 “N 플래그”에 저장됬다!

bpl $901B

“V 0" 이면 "N XOR V"를 하기 위한 위의 연산("eor")이 필요없다. V 0 일 때 XOR 연산을 하면 항상 자기 자신(N)이 나온다.

  • 따라서 이미 “N XOR V”의 값이 “N 플래그”에 저장됬다!

그리고 “N 플래그”(N XOR V의 결과)에 따라 분기하면 된다.

“N 플래그”가 1일 경우, 즉 음수인 경우(“bit 7”이 1) “A < M” 일 때 실행할 코드를 실행하면 되고, 반대인 경우 “A >= M”일 때 실행할 코드를 실행하도록 조건문을 구현한다.

“bpl”(branch on plus)을 사용하면 “N 플래그”값이 0 일 때 분기한다. 따라서 “bpl” 바로 아래에 “A < M” 일 때 실행할 코드를 넣으면 된다.

A Few Years Later…

하드웨어의 발전!

복습 퀴즈

cmp 명령어가 비교를 수행하는 방법은 무엇인가요?

값을 부호 없는 정수로 취급하여 뺄셈을 수행한다.

cmp는 비트 패턴만 봐유~ 참고

다음 코드를 읽고 질문에 답하세요.

lda #$?? 
cmp #$10
bxx label

1. A가 $10과 같은 경우 분기하려면 bxx 대신 어떤 니모닉을 사용해야 하나요?

같으면 “Z 플래그”가 켜지겠죠? branch equal

정답: “beq”

2. A가 $10 이상인 경우 분기하려면 bxx 대신 어떤 니모닉을 사용해야 하나요?

이상인 경우 “cmp” 연산에서 뺏을 때 받아내림이 없다. “C 플래그”가 켜진다.

branch c set

정답: bcs

3. A가 $10 미만인 경우 분기하려면 bxx 대신 어떤 니모닉을 사용해야 하나요?

이상의 반대니까

branch c clear

정답: bcc