AVR Architecture와 Assembly Language Basic
왜 Assembly Language Program에 대한 이해가 필요 한가?
Assembly Language 의 특징
Assembly Language Basic
Index Rg 와 Counter Rg가 있는 경우의 예
일반적인 uP(Microprocessor)에서 Registers의 종류와 역활
Stack Pointer
Stack Pointer instructions
SPH and SPL - Stack Pointer High and Low Register
LIFO 과 FIFO 알고리즘
Subroutines and the Stack
AVR Memory Space
AVR uP의 Addressing Mode
AVR Instructions
Assembly Language 관련 페이지 보기
- 왜 Assembly Language Program에 대한 이해가 필요 한가?
- Assembly Language 의 특징
- Assembly Language Basic
- AVR uP의 Addressing Mode
- AVR Instructions
- Assembly Language 관련 페이지 보기
- 프로세서 동작에 대한 이해와 최적한 프로그램(실행 속도와 메모리 크기 등) 개발에 필요한 지식을 제공 한다.
- Assembly Program은 Performance-critical한 Program(Routine) 작성에 필요 하다.
- Assembly에 대한 지식은 Code debugging(Compiler 또는 Code olitimizers 등의 오류)에 필요 하다.
- Assembly는 Source code가 없는 실행 파일을 고치거나 Interface 하는데 이용 할 수 있다. 실행 파일을 Disassembly 하여 변경 하거나 수정 할 수 있다.
- Higher-level Language 가 지원하지 못하는 Hardware 기능을 사용하여야 하는 경우 유용 하다.
- Assembler Instructions은 1대 1로 Machine Instruction에 대응 한다.
- uP의 성능을 100% 구현 할 수 있다.
- 가장 효율적인 프로그램 구현이 가능 하다.
- 실행 속도
- 프로그램 Code 길이
- 배우기 쉽다.
- Instruction Set 란?
- 프로세서(CPU)에서 실행되는 명령어 집합을 말한다.
- Binary Instructions
- 명령어에서 Binary pattern 1110101000001010(0xEA0A) 의 의미는
- R16 ← 0xAA (LDI R16,0xAA)의 의미 이다.
- 위 Binary Instruction은 프로세서에게는 효과적인 명령 이지만 인간이 이해하기에는 너무 불편하여 보다 효과적인 표시 방법이 필요 하여,
- 16진법 또는 8진법을 이용하여 Binary pattern(0xEA0A)을 표시 한다.
- 그러나, 16진법과 8진법도 인간이 프로세서의 동작을 이해하기에 부족 하기 때문에 Assembly Language(LDI R16,0xAA)를 사용 한다.
- Assembly Language
- 인간이 좀더 쉽게 프로세서의 명령을 이해할 수 있도록 이해하기 쉬운 심볼을 사용한 프로그래밍 언어 이다.
- 예
- Assembler
- 그러나 Assembly Language는 프로세서가 직접 실행할 수 없기 때문에 Assembly Language로 작성된 프로그램을 Binary Instruction 으로 변환 하는 프로그램이 필요 하게 되고, 이 프로그램이 Assembler 이다.
- Assembly language Program 작성과 실행
- AVR128A Processor Architectural Overview
- Architectural Overview
- Harvard architecture
- Program 과 data 를 위한 Memory와 Bus가 분리되어 있다.
- Register file : 32개의 8-bit Register를 갖고 있다.
- 3개의 16-bit Indirect register 가 있다.
- ALU(Arithmetic logic unit): 산술연산(Arithmetic operation: 가산, 감산, 정수 승산)과 Logic operation 기능을 갖고 있다.
- D Rg ← Rg fun Rg
- D Rg ← Rg fun Constant
- Program Flash memory space 는
- Boot Program section 과
- Application Program section 2가지로 구성 된다.
- I/O memory space는 64 addresses 공간(In, Out 명령은 이 주소 만을 사용 할 수 있다.)을 갖고 있다: $20 - $5F
- ATmega128A 는 Extended I/O space($60 - $FF in SRAM)를 갖는다. 오직 ST/STS/STD and LD/LDS/LDD 명령만 사용 가능 함.
- ALU – Arithmetic Logic Unit
- High-performance AVR ALU operation
- 32 개의 general purpose working registers와 직접 연결 되어 있다.
- Single clock cycle arithmetic operations
- Three main categories ALU operations
- Arithmetic, Logical, and Bit-functions
- Powerful multiplier
- Signed/unsigned multiplication
- Status Register
- 최근에 실행된 Arithmetic instruction 결과에 대한 정보를 표시한다.
- 이 정보는 Program 흐름을 바꾸는 Conditional Operations에 사용 할 수 있다.
- 모든 ALU 연산에 의하여 Status Rg 가 Update 된다.
- SREG - AVR Status Register
- Bit 7 – I: Global Interrupt Enable Bit
- Bit 6 – T: Bit Copy Storage
- Bit Copy instructions BLD (Bit LoaD) 과 BST (Bit STore) 에서 T-bit 가 source 또는 destination 으로 사용 된다.
- Bit 5 – H: Half Carry Flag : Half carry는 BCD arithmetic에서 이용 된다.
- Bit 4 – S: Sign Bit, S = N xor V : Negative Flag 와 Two’s Complement Overflow Flag의 Exclusive or
- Bit 3 – V: Two’s Complement Overflow Flag
- Bit 2 – N: Negative Flag
- Bit 1 – Z: Zero Flag
- Bit 0 – C: Carry Flag
- AVR General Purpose Register
- Register File의 Address Map
- Data memory space 의 첫 32($20) 번지에 mapping 된다.
- AVR General Purpose Register File
- X-register, Y-register, and Z-register
- Index Rg 이용 예
- 1000 번지 부터 1099 번지 까지 100Byte를 2000 번지 부터 저장하라.
- Index Rg 가 없는 경우의 예
Instruction Mnemonic | Rg/Memory | Hexadecimal Equivalent |
---|---|---|
ldi | R16, 0xAA | EA0A |
mov | R0, R16 | 2E00 |
ldi | R16, 0x55 | E505 |
mov | R2, R16 | 2E20 |
Block Diagram of the AVR Architecture
ALU의 동작을 기술하는 아래 예(Assembly Language 예 가 아님)는 Rg(Register)와 Rg(또는 상수)의 연산(fun(Function: ALU에서 가능한 산술과 논리 연산)) 결과가 D Rg에 저장 되는 동작을 이해하기 쉬운 형태로 표시한 예 이다. 이러한 동작은 모든 Processor의 기본 동작이지만 Processor를 설계하는 회사에 따라 서로 다른 Assembly Language로 표현된다.
아래 설명에서 괄호()는 ( )안의 값이 Data 가 있는 주소(Index) 인 것을 표시 한다. 실제 Data 가 있는 주소를 저장 하는 Rg를 Index Rg라 한다.
아래 예는 Microprocessor에서 Index Rg의 중요성을 설명 하기 위한 것이다.
Start :
(2000) ← (1000)
(2001) ← (1001)
(2002) ← (1002)
--- ---
--- ---
(2099) ← (1099)
위와 같이 프로그램 하여야 하기 때문에 복사 하여야
하는 Data가 많은 경우 프로그램 길이가 너무 길어
지기 때문에 Microprocessor로 사용 할 수 없다.
Start :
Index Rg1 ← 1000
Index Rg2 ← 2000
Counter Rg ← 100
Loop:
(Index Rg2) ← (Index Rg1)
Index Rg1 ← Index Rg1 + 1
Index Rg2 ← Index Rg2 + 1
Counter Rg ← Counter Rg - 1
If (Counter Rg != 0 ) goto Loop
Done:
위와 같이 Index Rg와 Counter의 값만 조절 하면 반복되는
Loop를 사용 하여 큰 data도 쉽게 복사 할 수 있다.
- Data Rg
- 연산 및 자료 처리에 필요한 Data를 저장함
- Index Rg
- Operand 의 주소를 저장( Pointing ) 함.
- Stack Pointer
- Last-In-First-Out : Stack Operation
- First-In-First-Out : Buffed I/O 에 유용
- Program Counter
- 다음에 실행할 명령어의 번지를 저장함.
- Status Rg
- 연산 결과 상태를 표시하는 Flag 를 저장함.
- Stack은 LIFO(Last In First Out) 알고리즘을 수행 한다.
- Stack의 이용 분야
- Temporary data의 저장
- Local variables의 저장
- Interrupts 과 Subroutine calls 후 Return addresses의 저장
- Stack은 Stack 영역이 필요 할 경우 Stack memory의 Higher memory locations 로 부터 Lower memory locations으로 확장 된다.
- Stack Pointer Register 는 항상 Stack의 Top위치를 Pointing 한다.
- AVR Stack Pointer 는 I/O space 내에 Two 8-bit registers로 실현된다.
- Stack 영역을 작게 요구되는 기종에서는 SPL(8-bit)만 이용 된다.
- Last in First Out (LIFO)
- 사용 예 : Stack Operation
- First in First Out (FIFO)
- 사용 예 : I/O Buffer 등
- Stack Operation: Last in First Out (LIFO)
- Stack의 사용 예
- Subroutine 의 Return Address 저장
- Local variable 영역 확보
- Parameter Passing : 상위 계층 프로그램 모듈과 하위 모듈 사이에 Parameter Passing
- Subroutine 내에서 사용하는 Rg의 보호를 위한 임시 저장 장치로 사용
- push Operation: push Rg
- (SP) ← Rg ; Rg의 내용이 SP(Stack pointer)에 저장된 주소에 저장 된다. 이 때 SP는 Index Rg로 사용 된다.
- SP ← SP - 1
- AVR uP의 push Operation 예
- ldi R16, 0xAA
- push R16
- pop Operation: pop Rg
- SP ← SP + 1
- Rg ← (SP) ; SP에 저장된 주소에 저장된 Data를 Rg로 복사 한다.
- AVR uP의 pop Operation 예
- pop R16
- Subroutine
- Call sub
- (SP) ← PC ; Subroutine으로 Jump 하기 전에 Return 주소를 Stack에 저장 한다.
- SP ← SP--
- PC ← Subroutine의 시작 번지
- Return
- SP ← SP ++
- PC ← (SP) ; Stack에 저장된 Return 주소를 PC(Program counter)에 복사 한다.
주: 여기에서 ++, -- 의 의미는 다음 번지, 이전 번지의 의미 임.
- Data Memory Map
- Working Registers(32 개)
- Includes X, Y, and Z registers.
- I/O Register Space
- 64 I/O Registers
- 160 Ext. I/O Reg
- SRAM – Data Space
- Runtime Variables 과 Data를 저장 하는 공간과
- Stack space로 사용 된다.
- Program Flash Memory Map
- Program Flash Memory
- Interrupt Vectors,
- Program Code,
- Constant Data(Unchangeable)는 Program Flash Memory에 저장 된다.
- Boot Program Flash Memory
- EEPROM space
- For non-volatile but alterable data
- Data Memory Map
- ATmega128 uP의 I/O Port 번호와 Data Memory Space(Address)
- ATmega128A의 모든 I/O 와 주변 장치는 I/O Space 와 Data Memory Space에 할당 되어 있다.
- I/O Space에 할당된 모든 I/O와 주변 장치가 사용 하는 Register는 32개의 Register(Data)와 Data Transfer 가 가능 하다.
- IN, OUT 명령은 I/O Port 번호 $00 - $3F에 할당된 I/O Port와 주변 장치에 사용 한다.
- Data Memory Space에 있는 I/O Registers($60-$FF)는 LD 와 ST 명령을 사용 한다.
- I/O Space에 있는 I/O Port의 실제 번지는 I/O Port 번호에 $0020 (32개의 일반 Register에 할당된 $0-$19($20) 번지 값)을 더 한 값이 된다. 참고자료: ATmega128_doc8151.pdf
- SRAM Data Memory
- Tmega128A Normal Mode
- Register file : First 32($0-$1f) locations address
- Standard I/O memory : Next 64($20-$5f) location
- Extended I/O memory : Next 160($60-$ff) locations
- Internal data SRAM : Next 4096 locations address
- In-System Reprogrammable Flash Program Memory
- 128K bytes (64K Word) On-chip In-System
- All AVR instructions are 16 or 32 bits width.
- Flash is organized as 64K x 16
- Divided into two sections
- Boot Program section and
- Application Program section.
- Boot section size는 Fuse 설정 (BOOTSZ)에 따라 선택 가능
- BOOTSZ=00 : 4096 Word
- BOOTSZ=01 : 2048 Word
- BOOTSZ=10 : 1024 Word
- BOOTSZ=11 : 512 Word
- ATmega128 uP의 EEPROM Data Memory
- 4K bytes 의 Data EEPROM memory
- Separate data space
- Single bytes read, written 가 가능 함.
- EEPROM access registers are accessible in the I/O space
- EEPROM is read, the CPU is halted for four clock cycles before the next instruction is executed
- EEPROM is written, the CPU is halted for two clock cycles before the next instruction is executed
Memory Configurations
참고자료: AVR Addressing Mode
ATmega128의 Addressing Mode 요약: AVR_addressing_Mode.pdf
- AVR has 133 different instructions
- Instruction Types
- Data Transfer
- Arithmetic and Logic
- Control Transfer (branch/jump)
- Bit and bit-test
- Processor Control
참고자료: AVR ASM Instructions
ATmega128 Instructions 요약: ATmega128_Instructions.pdf