증감 연산

값을 1만큼 증가 혹은 감소하는 연산
C 코드로 ++i;, --i; 같은 연산을 말한다.
잦은 연산이라 별도의 명령어를 제공
adc로 처리해도 될 것 같지만, 별도의 명령어를 제공한다.
num = num + 1 보다 빠름 특히 메모리에 있는 값을 증감할 경우
inc 는 어떤 메모리의 값을 1씩 증가한다.
- 이 연산이 빠르다.
- “주소 모드”에 어떤 것이 있는지 확인 해보면
- zp, a
- 메모리 관련이네?
inx, iny 는 “X 레지스터”, “Y 레지스터”의 값을 증가하니 당연히 빠르죠?!
- “암시 모드”로 피연산자가 없음
위 명령어들은 하드웨어 단에서 처리하기 때문에 빠르다고 생각하면 된다.

똑같이 감소하는 연산
유사하죠?!
dec,inc의 사이클에 주목하자
아무리 빨라도 5 사이클이네??
다른 연산은 더 느리다
더 느린 연산과 비교하기

inc zp 기준으로 동일한 과정을 구현하려면 아래와 같다.
- lda zp 로 A 레지스터에 값을 로드한다.
- adc 즉시 모드 로 1을 증가시킨다.
- sta zp 로 A 레지스터의 값(1이 증가된 값)을 메모리에 저장한다.
3 + 2 + 3 = 8 사이클
ina 는 없나요?



adc 즉시 모드로 1을 피연산자로 더하면 된다.
2 사이클이다.
inx, iny 와 사이클 수가 동일하다. 이미 adc로 충분히 빠르게 연산할 수 있으니 굳이 새로운 연산을 만들 필요가 없겠구나 생각하면 된다.
- 이 때문에 최적화를 위해 어셈블리어 명령어 메뉴얼을 업데이트하는 것이 좋다. 하드웨어 만드는 곳에서 니모닉을 추가하면서 최적화 하는 경향이 었기 때문이다.
- 새로 연산을 만들면 회로도 만들고 트랜지스터 체인도 추가해야하고… 비용이다.
컴파일러가 이런 최적화를 해준다. 즉 어셈블리어를 잘 조합 해준다.
X, Y 레지스터를 지원하는 이유?


특히 아래와 같이 배열 색인에 사용한다면 이걸 1씩 증감할 일이 많음
024. X, Y 색인 레지스터 에서 봤듯이 "X 레지스터"와 "Y 레지스터"의 주 용도는 배열의 색인이다.
for 문에서 배열을 순회하는 연산은 매우~매우 자주 일어나기 때문에 하드웨어 제작자가 색인 레지스터와 증감 연산 니모닉을 만들어 둔 것이다.