테크/AVR(Microchip Studio)

[µ-Processor] AVR내부연산 & Opcode

2021. 7. 17. 12:41

앞에서 변수를 선언하고 연산을 했다면 내부적으로 어떻게 연산이 이루어지는지 알아보자.

 

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)

                            왼) carry 적용                                                                      오) 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
'테크/AVR(Microchip Studio)' 카테고리의 다른 글
  • [AVR] Atmel Studio7 레지스터 제어, Simulator 디버깅
  • [µ-Processor] 내부구조(ALU)
  • [µ-Processor] 기본적인 어셈블리어 & 문법
  • [µ-Processor] 입문
시그널보내
시그널보내
삽질을 통해 깊게 공부하는 Electronic Engineer 연락 및 문의사항은 'donghyun9904@naver.com' 으로 부탁드립니다!
시그널보내
시그널보내
시그널보내
전체
오늘
어제
  • 분류 전체보기 (86)
    • 감상평 (0)
    • 테크 (4)
      • Network (2)
      • C | C++ (3)
      • MATLAB (12)
      • OSEK ⁄ VDX (4)
      • AVR(Microchip Studio) (9)
      • STM32 (1)
      • PcB (2)
      • [verilog | VHDL] (6)
      • 라즈베리파이 (4)
      • 아두이노 (6)
      • ML | DL (5)
      • ROS (3)
      • 리눅스 (12)
      • 프로젝트 (3)
      • 예제 (3)
    • 연수 ⁄ 교육 (4)
    • 대회 ⁄ 공모전 (3)
    • 취준 (4)
    • 사담 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 현대오토에버 모빌리티 임베디드 SW스쿨
  • osekos
  • 머신러닝
  • 선형회귀
  • MSE
  • VHDL
  • 리눅스
  • 경사하강법
  • 마이크로프로세서
  • vhdl문법
  • 차량용운영체제
  • 매트랩
  • 아트멜스튜디오
  • 현대오토에버
  • osek
  • 아두이노avr
  • 아두이노
  • 라즈베리파이
  • AVR
  • IDEC

최근 댓글

최근 글

hELLO · Designed By 정상우.
시그널보내
[µ-Processor] AVR내부연산 & Opcode
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.