앞에서 변수를 선언하고 연산을 했다면 내부적으로 어떻게 연산이 이루어지는지 알아보자.
AVR은 분명 8비트 운영체제인데 변수를 char로 선언하면 8비트에 딱 맞게 저장 할 수 있지만 이보다 큰 자료형은 저장공간을 어떻게 할당하며 내부 연산이 이루어질까?
예를들어 short a;라는 변수를 만들었다고 가정하자.
short는 16비트라 하나의 레지스터(8비트) 안에 들어가지 못한다.
이를 해결하기 위해서는 다음 레지스터 공간을 같이 할당해주면 된다.
이와같이 short자료형은 R0, R1을 동시에 할당해 주면 된다.
덧셈 연산은 각각의 MSB부와 LSB부를 맞춰서 연산을 한다.
내부적으로 위와 같은 연산이 이루어짐을 결과를 통해 확인 할 수 있다.
그러나 위의 코드만 작성을 하면 문제점이 발생한다.
예를들어 R2, 255 / R3, 1 을 저장하면 R2레지스터에 값이 포화상태가 된다.
이대로 연산을 하게 되면 512라는 전혀 엉뚱한 값이 나온다.
이때 올림수(Carry)도 같이 고려를 해야 정상적인 덧셈연산을 할 수 있다.
ADC Rd, Rr : 캐리도 같이 더한다.(Rd <- Rd + Rr + Carry)
16진수 0x0300으로 768이 정상적으로 연산되었음을 확인 할 수 있다.
Opcode
AVR에 명령만 내린다고 해서 연산이 이루어지는 것이 아니라 실제로 0과 1로 이루어진 형태로 16비트 연산이 이루어진다
각각의 명령어별로 정해진 16비트 형태의 코드가 있으며 이를 Opcode라고 부른다.
ADD
ADD라는 명령어의 Opcode는 "0000 11rd dddd rrrr"이며 d와 r에는 레지스터의 번호가 입력된다.
예를들어 ADD R3, R2라는 명령을 내리면 3은 이진수로 00011, 2는 00010이다.
따라서 해당 명령의 Opcode는 "0000 1100 0011 0010"이며 0x0c32로 표현가능하다.
LDI
또 다른 예로 LDI의 OPcode는 "1110 kkkk dddd kkkk"이다.
이때, k와 d의 범위가 (16≤d≤31, 0≤k≤255)정해져 있다.
여기서 LDI레지스터를 16번부터 31번까지밖에 사용하지 못하는것을 알 수 있다.
예를들어 LDI 17, 5 라고 선언하면 Opcode는 "1110 0000 0001 0101"이며 0xe015로 표현 가능하다.
PC(Program Counter)
이렇게 각각의 메모리에 데이터를 저장을 했다. 그렇다면 어떻게 처음 부터 마지막 메모리까지 계산을 할까?
그것은 바로 MCU에 PC(Program Counter)가 내장되어있어서 사용자가 명령을 내리면 메모리 하나를 방문 할 때 마다 카운트 한다.
따라서 실제 AVR내부에서 이루어지는 연산과정은 다음과 같다.
[ATmega128 manual]
AVR Instruction Set Manual (microchip.com)
'AVR(Microchip Studio)' 카테고리의 다른 글
[AVR] 아두이노를 이용한 AVR코딩 & 버튼 채터링(Microchip Studio) (0) | 2021.12.25 |
---|---|
[AVR] Atmel Studio7 레지스터 제어, Simulator 디버깅 (0) | 2021.12.23 |
[µ-Processor] 내부구조(ALU) (1) | 2021.07.20 |
[µ-Processor] 기본적인 어셈블리어 & 문법 (0) | 2021.07.17 |
[µ-Processor] 입문 (0) | 2021.07.15 |