signed 비교 방법 2

sbc를 사용하여 A - M을 계산
“sbc”를 사용한 이유는 “V 플래그”를 바꾸기 때문이다.

signed 뺄셈의 가능한 조합

“양수 - 양수”, “음수 - 음수” >> 절대 오버플로 안나죠?
sbc 에서 “sbc”의 동작을 확인해볼까??
V 플래그: signed 오버플로가 발생하면 켜짐
- 결과가 [-128, 127] 범위를 넘어서면 켜짐
양수 중에 가장 작은 수는 0x00000000, 이 값이 “A 레지스터”의 값이라고 간주하자.
양수 중에 가장 큰 수는 0x01111111, 이 값이 M(피연산자)의 값이라고 간주하자.
직관적으로 그냥 빼도 -127이라 [-128, 127]의 범위를 벗어나지 않았다.
“오버플로우 플래그”의 정의를 적용해보자.
“sbc”를 수행하면 다음과 같다.
- “캐리 플래그”는 1로 시작
- “M의 부호를 뒤집음”
0x1000_0000
- 뒤집힌 M에 “캐리 플래그” 값을 더함
0x1000_0001
- 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 명령어가 비교를 수행하는 방법은 무엇인가요?
값을 부호 없는 정수로 취급하여 뺄셈을 수행한다.
다음 코드를 읽고 질문에 답하세요.
lda #$??
cmp #$10
bxx label1. 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