이 블로그는 임베디드 컴퓨터를 이용한 장치(시스템) 개발과 원격제어에 필요한 지식을 공유 하기 위한 블로그 입니다.
실제 개발과 프로그램 예를 위하여 Microchip 사의 ATmega128를 사용한 보드와 Arduino Mega 보드(ATmega2560), Raspberry Pi, Raspberry Pi Pico, WiFi 모듈을 사용 합니다.

avr-asm-basic

AVR Assembler
  AVR Architecture와 Assembly Language Basic



  • 왜 Assembly Language Program에 대한 이해가 필요 한가?
    • 프로세서 동작에 대한 이해와 최적한 프로그램(실행 속도와 메모리 크기 등) 개발에 필요한 지식을 제공 한다.
    • Assembly Program은 Performance-critical한 Program(Routine) 작성에 필요 하다.
    • Assembly에 대한 지식은 Code debugging(Compiler 또는 Code olitimizers 등의 오류)에 필요 하다.
    • Assembly는 Source code가 없는 실행 파일을 고치거나 Interface 하는데 이용 할 수 있다. 실행 파일을 Disassembly 하여 변경 하거나 수정 할 수 있다.
    • Higher-level Language 가 지원하지 못하는 Hardware 기능을 사용하여야 하는 경우 유용 하다.

  • Assembly Language 의 특징
    • Assembler Instructions은 1대 1로 Machine Instruction에 대응 한다.
      • uP의 성능을 100% 구현 할 수 있다.
    • 가장 효율적인 프로그램 구현이 가능 하다.
      • 실행 속도
      • 프로그램 Code 길이
    • 배우기 쉽다.

  • Assembly Language Basic
    • 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
      • 인간이 좀더 쉽게 프로세서의 명령을 이해할 수 있도록 이해하기 쉬운 심볼을 사용한 프로그래밍 언어 이다.
        • Instruction Mnemonic Rg/Memory Hexadecimal Equivalent
          ldi  R16, 0xAA EA0A
            mov R0, R16 2E00
          ldi   R16, 0x55 E505
            mov R2, R16 2E20
    • Assembler
      • 그러나 Assembly Language는 프로세서가 직접 실행할 수 없기 때문에 Assembly Language로 작성된 프로그램을 Binary Instruction 으로 변환 하는 프로그램이 필요 하게 되고, 이 프로그램이 Assembler 이다.
    • Assembly language Program 작성과 실행
    • AVR128A Processor Architectural Overview
      • Block Diagram of the AVR Architecture

    • 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 기능을 갖고 있다.
      • ALU의 동작을 기술하는 아래 예(Assembly Language 예 가 아님)는 Rg(Register)와 Rg(또는 상수)의 연산(fun(Function: ALU에서 가능한 산술과 논리 연산)) 결과가 D Rg에 저장 되는 동작을 이해하기 쉬운 형태로 표시한 예 이다. 이러한 동작은 모든 Processor의 기본 동작이지만 Processor를 설계하는 회사에 따라 서로 다른 Assembly Language로 표현된다.

        • 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 가 없는 경우의 예
          • 아래 설명에서 괄호()는 ( )안의 값이 Data 가 있는 주소(Index) 인 것을 표시 한다. 실제 Data 가 있는 주소를 저장 하는 Rg를 Index Rg라 한다.

            아래 예는 Microprocessor에서 Index Rg의 중요성을 설명 하기 위한 것이다.

            
            Start :
                   (2000) ← (1000)
                   (2001) ← (1001)
                   (2002) ← (1002)
                     ---      ---
                     ---      ---
                   (2099) ← (1099)
            	   
            	   위와 같이 프로그램 하여야 하기 때문에 복사 하여야
            	   하는 Data가 많은 경우 프로그램 길이가 너무 길어
            	   지기 때문에 Microprocessor로 사용 할 수 없다.
                   
          • Index Rg 와 Counter Rg가 있는 경우의 예
          • 
            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도 쉽게 복사 할 수 있다.
            	   
    • 일반적인 uP(Microprocessor)에서 Registers의 종류와 역활
      • 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 Pointer
      • 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 한다.
    • Stack Pointer instructions
    • SPH and SPL - Stack Pointer High and Low Register
      • AVR Stack Pointer 는 I/O space 내에 Two 8-bit registers로 실현된다.
      • Stack 영역을 작게 요구되는 기종에서는 SPL(8-bit)만 이용 된다.
    • LIFO 과 FIFO 알고리즘
      • Last in First Out (LIFO)
        • 사용 예 : Stack Operation
      • First in First Out (FIFO)
        • 사용 예 : I/O Buffer 등
    • Subroutines and the Stack
      • 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)에 복사 한다.
          • 주: 여기에서 ++, -- 의 의미는 다음 번지, 이전 번지의 의미 임.

    • AVR Memory Space
      • 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
      • Memory Configurations

        • 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

  • AVR uP의 Addressing Mode
  • AVR Instructions
    • 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


  • Assembly Language 관련 페이지 보기