AVR 어셈블리어 정리

출처1 : http://blog.naver.com/hsmc77?Redirect=Log&logNo=47507888

출처2 : http://cafe.naver.com/allcyber.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=1023

출처3 : http://cafe.naver.com/circuitsmanual/184455


■ 데이터 시트

atmega328_datasheet.pdf

atmega328_datasheet.pdf



1. AVR 입출력포트 레지스터 정리


VR 포트의 레지스터는 3종류가 있습니다.


입력 레지스터 PINx

출력 레지스터 PORTx

입출력 방향 설정 레지스터  DDRx


데이터시트를 봐야겠죠?


reg.png

포트A 레지스터만 복사 했습니다.


R/W라고 적힌 부분은 읽기/쓰기가 모두 가능하다는 뜻입니다.

R이라고만 적힌 비트도 있는데 Read만 가능하다는 뜻이고

(이 그림에는 없지만) W라고만 적힌 비트는 Write만 가능하다는 뜻입니다.


리셋 초기 값은

DDRx=0 입력

PORTx=0 내부 풀업저항 사용 안함 입니다.

PINA에 N/A로 되어 있는 이유는

계속해서 핀에 걸려있는 값으로 갱신 되므로 초기값을 줄 필요가 없기 때문입니다.

명칭에서도 녹색의 사각형을 보면 Register라고 적혀있지 않고 Address라고 적혀있습니다.


2. AVR 명령어 정리

 

1. 전체 명령어 정리

Rd: Destination (and source) register in the register file 
Rr: Source register in the register file 
b: Constant (0-7), can be a constant expression 
s: Constant (0-7), can be a constant expression 
P: Constant (0-31/63), can be a constant expression 
K6; Constant (0-63), can be a constant expression 
K8: Constant (0-255), can be a constant expression 
k: Constant, value range depending on instruction. Can be a constant expression 
q: Constant (0-63), can be a constant expression 
Rdl:  R24, R26, R28, R30. For ADIW and SBIW instructions 
X,Y,Z: Indirect address registers (X=R27:R26, Y=R29:R28, Z=R31:R30)

Arithmetic and Logic Instructions

Mnemonic

Operands

Description

Operation

Flags

Cycles

ADD 

Rd,Rr 

Add without Carry 

Rd = Rd + Rr 

Z,C,N,V,H,S 

1

ADC

Rd,Rr

Add with Carry

Rd = Rd + Rr + C

Z,C,N,V,H,S

1

SUB

Rd,Rr

Subtract without Carry

Rd = Rd - Rr

Z,C,N,V,H,S

1

SUBI

Rd,K8

Subtract Immediate

Rd = Rd - K8

Z,C,N,V,H,S

1

SBC

Rd,Rr

Subtract with Carry

Rd = Rd - Rr - C

Z,C,N,V,H,S

1

SBCI

Rd,K8

Subtract with Carry Immedtiate

Rd = Rd - K8 - C

Z,C,N,V,H,S

1

AND

Rd,Rr

Logical AND

Rd = Rd · Rr

Z,N,V,S 

1

ANDI

Rd,K8

Logical AND with Immediate

Rd = Rd · K8

Z,N,V,S

1

OR

Rd,Rr

Logical OR

Rd = Rd V Rr

Z,N,V,S

1

ORI

Rd,K8

Logical OR with Immediate

Rd = Rd V K8

Z,N,V,S

1

EOR

Rd,Rr

Logical Exclusive OR

Rd = Rd EOR Rr

Z,N,V,S

1

COM

Rd

One's Complement

Rd = $FF - Rd

Z,C,N,V,S

1

NEG

Rd

Two's Complement

Rd = $00 - Rd

Z,C,N,V,H,S

1

SBR

Rd,K8

Set Bit(s) in Register

Rd = Rd V K8

Z,C,N,V,S

1

CBR

Rd,K8

Clear Bit(s) in Register

Rd = Rd · ($FF - K8)

Z,C,N,V,S

1

INC

Rd

Increment Register

Rd = Rd + 1

Z,N,V,S

1

DEC

Rd

Decrement Register

Rd = Rd -1

Z,N,V,S

1

TST

Rd

Test for Zero or Negative

Rd = Rd · Rd

Z,C,N,V,S

1

CLR

Rd

Clear Register

Rd = 0

Z,C,N,V,S

1

SER

Rd

Set Register

Rd = $FF

None

1

ADIW

Rdl,K6

Add Immediate to Word

Rdh:Rdl = Rdh:Rdl + K6 

Z,C,N,V,S

2

SBIW

Rdl,K6

Subtract Immediate from Word

Rdh:Rdl = Rdh:Rdl - K 6

Z,C,N,V,S

2

MUL

Rd,Rr

Multiply Unsigned

R1:R0 = Rd * Rr

Z,C

2

MULS

Rd,Rr

Multiply Signed

R1:R0 = Rd * Rr

Z,C

2

MULSU

Rd,Rr

Multiply Signed with Unsigned

R1:R0 = Rd * Rr

Z,C

2

FMUL

Rd,Rr

Fractional Multiply Unsigned

R1:R0 = (Rd * Rr) << 1

Z,C

2

FMULS

Rd,Rr

Fractional Multiply Signed

R1:R0 = (Rd *Rr) << 1

Z,C

2

FMULSU

Rd,Rr

Fractional Multiply Signed with Unsigned

R1:R0 = (Rd * Rr) << 1

Z,C

2

  

Branch Instructions

Mnemonic

Operands

Description

Operation

Flags

Cycles

RJMP

k

Relative Jump

PC = PC + k +1

None

2

IJMP

None

Indirect Jump to

PC = Z

None

2

EIJMP

None

Extended Indirect Jump (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) = EIND

None

2

JMP

k

Jump 

PC = k

None

3

RCALL

k

Relative Call Subroutine

STACK = PC+1, PC = PC + k + 1

None

3/4*

ICALL

None

Indirect Call to (Z)

STACK = PC+1, PC = Z 

None

3/4*

EICALL

None

Extended Indirect Call to (Z)

STACK = PC+1, PC(15:0) = Z, PC(21:16) =EIND

None

4*

CALL

k

Call Subroutine

STACK = PC+2, PC = k

None

4/5*

RET

None

Subroutine Return

PC = STACK

None

4/5*

RETI

None

Interrupt Return

PC = STACK

I

4/5*

CPSE

Rd,Rr

Compare, Skip if equal 

if (Rd ==Rr) PC = PC 2 or 3

None

1/2/3

CP

Rd,Rr

Compare

Rd -Rr

Z,C,N,V,H,S

1

CPC

Rd,Rr

Compare with Carry

Rd - Rr - C

Z,C,N,V,H,S

1

CPI

Rd,K8

Compare with Immediate

Rd - K

Z,C,N,V,H,S

1

SBRC

Rr,b

Skip if bit in register cleared

if(Rr(b)==0) PC = PC + 2 or 3

None

1/2/3

SBRS

Rr,b

Skip if bit in register set

if(Rr(b)==1) PC = PC + 2 or 3

None

1/2/3

SBIC

P,b

Skip if bit in I/O register cleared

if(I/O(P,b)==0) PC = PC + 2 or 3

None

1/2/3

SBIS

P,b

Skip if bit in I/O register set

if(I/O(P,b)==1) PC = PC + 2 or 3

None

1/2/3

BRBC

s,k

Branch if Status flag cleared

if(SREG(s)==0) PC = PC + k + 1

None

1/2

BRBS

s,k

Branch if Status flag set

if(SREG(s)==1) PC = PC + k + 1

None

1/2

BREQ

k

Branch if equal

if(Z==1) PC = PC + k + 1

None

1/2

BRNE

k

Branch if not equal

if(Z==0) PC = PC + k + 1

None

1/2

BRCS

k

Branch if carry set

if(C==1) PC = PC + k + 1

None

1/2

BRCC

k

Branch if carry cleared

if(C==0) PC = PC + k + 1

None

1/2

BRSH

k

Branch if same or higher

if(C==0) PC = PC + k + 1

None

1/2

BRLO

k

Branch if lower

if(C==1) PC = PC + k + 1

None

1/2

BRMI

k

Branch if minus

if(N==1) PC = PC + k + 1

None

1/2

BRPL

k

Branch if plus

if(N==0) PC = PC + k + 1

None

1/2

BRGE

k

Branch if greater than or equal (signed)

if(S==0) PC = PC + k + 1

None

1/2

BRLT

k

Branch if less than (signed)

if(S==1) PC = PC + k + 1

None

1/2

BRHS

k

Branch if half carry flag set

if(H==1) PC = PC + k + 1

None

1/2

BRHC

k

Branch if half carry flag cleared

if(H==0) PC = PC + k + 1

None

1/2

BRTS

k

Branch if T flag set

if(T==1) PC = PC + k + 1

None

1/2

BRTC

k

Branch if T flag cleared

if(T==0) PC = PC + k + 1

None

1/2

BRVS

k

Branch if overflow flag set

if(V==1) PC = PC + k + 1

None

1/2

BRVC

k

Branch if overflow flag cleared

if(V==0) PC = PC + k + 1

None

1/2

BRIE

k

Branch if interrupt enabled

if(I==1) PC = PC + k + 1

None

1/2

BRID

k

Branch if interrupt disabled

if(I==0) PC = PC + k + 1

None

1/2

 

Data Transfer Instructions

Mnemonic

Operands

Description

Operation

Flags

Cycles

MOV

Rd,Rr

Copy register

Rd = Rr

None

1

MOVW

Rd,Rr

Copy register pair

Rd+1:Rd = Rr+1:Rr, r,d even

None

1

LDI

Rd,K8

Load Immediate

Rd = K

None

1

LDS

Rd,k

Load Direct

Rd = (k)

None

2*

LD

Rd,X

Load Indirect

Rd = (X)

None

2*

LD

Rd,X+

Load Indirect and Post-Increment

Rd = (X), X=X+1

None

2*

LD

Rd,-X

Load Indirect and Pre-Decrement

X=X-1, Rd = (X)

None

2*

LD

Rd,Y

Load Indirect

Rd = (Y)

None

2*

LD

Rd,Y+

Load Indirect and Post-Increment

Rd = (Y), Y=Y+1

None

2*

LD

Rd,-Y

Load Indirect and Pre-Decrement

Y=Y-1, Rd = (Y)

None

2*

LDD

Rd,Y+q

Load Indirect with displacement

Rd = (Y+q)

None

2*

LD

Rd,Z

Load Indirect 

Rd = (Z)

None

2*

LD

Rd,Z+

Load Indirect and Post-Increment

Rd = (Z), Z=Z+1

None

2*

LD

Rd,-Z

Load Indirect and Pre-Decrement

Z=Z-1, Rd = (Z)

None

2*

LDD

Rd,Z+q

Load Indirect with displacement

Rd = (Z+q)

None

2*

STS

k,Rr

Store Direct

(k) = Rr

None

2*

ST

X,Rr

Store Indirect

(X) = Rr

None

2*

ST

X+,Rr

Store Indirect and Post-Increment

(X) = Rr, X=X+1

None

2*

ST

-X,Rr

Store Indirect and Pre-Decrement

X=X-1, (X)=Rr

None

2*

ST

Y,Rr

Store Indirect

(Y) = Rr

None

2*

ST

Y+,Rr

Store Indirect and Post-Increment

(Y) = Rr, Y=Y+1

None

2

ST

-Y,Rr

Store Indirect and Pre-Decrement

Y=Y-1, (Y) = Rr

None

2

ST

Y+q,Rr

Store Indirect with displacement

(Y+q) = Rr

None

2

ST

Z,Rr

Store Indirect

(Z) = Rr

None

2

ST

Z+,Rr

Store Indirect and Post-Increment

(Z) = Rr, Z=Z+1

None

2

ST

-Z,Rr

Store Indirect and Pre-Decrement

Z=Z-1, (Z) = Rr

None

2

ST

Z+q,Rr

Store Indirect with displacement

(Z+q) = Rr

None

2

LPM

None

Load Program Memory

R0 = (Z)

None

3

LPM

Rd,Z

Load Program Memory

Rd = (Z)

None

3

LPM

Rd,Z+

Load Program Memory and Post-Increment

Rd = (Z), Z=Z+1

None

3

ELPM

None

Extended Load Program Memory

R0 = (RAMPZ:Z)

None

3

ELPM

Rd,Z

Extended Load Program Memory

Rd = (RAMPZ:Z)

None

3

ELPM

Rd,Z+

Extended Load Program Memory and Post Increment

Rd = (RAMPZ:Z), Z = Z+1

None

3

SPM

None

Store Program Memory

(Z) = R1:R0

None

-

ESPM

None

Extended Store Program Memory

(RAMPZ:Z) = R1:R0

None

-

IN

Rd,P

In Port

Rd = P

None

1

OUT

P,Rr

Out Port

P = Rr

None

1

PUSH

Rr

Push register on Stack

STACK = Rr

None

2

POP

Rd

Pop register from Stack

Rd = STACK

None

2

* Cycle times for data memory accesses assume internal memory accesses and are not valid for accesses through the external RAM interface. For the LD, ST, LDD, STD, LDS, STS, PUSH and  POP instructions, add one cycle plus one cycle for each wait state. 

Bit and Bit-test Instructions

Mnemonic

Operands

Description

Operation

Flags

Cycles

LSL

Rd

Logical shift left

Rd(n+1)=Rd(n), Rd(0)=0, C=Rd(7)

Z,C,N,V,H,S

1

LSR

Rd

Logical shift right

Rd(n)=Rd(n+1), Rd(7)=0, C=Rd(0)

Z,C,N,V,S

1

ROL

Rd

Rotate left through carry

Rd(0)=C, Rd(n+1)=Rd(n), C=Rd(7)

Z,C,N,V,H,S

1

ROR

Rd

Rotate right through carry

Rd(7)=C, Rd(n)=Rd(n+1), C=Rd(0)

Z,C,N,V,S

1

ASR

Rd

Arithmetic shift right

Rd(n)=Rd(n+1), n=0,...,6

Z,C,N,V,S

1

SWAP

Rd

Swap nibbles

Rd(3..0) = Rd(7..4), Rd(7..4) = Rd(3..0)

None

1

BSET 

s

Set flag

SREG(s) = 1

SREG(s)

1

BCLR

s

Clear flag

SREG(s) = 0

SREG(s)

1

SBI

P,b

Set bit in I/O register

I/O(P,b) = 1

None

2

CBI

P,b

Clear bit in I/O register

I/O(P,b) = 0

None

2

BST

Rr,b

Bit store from register to T

T = Rr(b)

T

1

BLD

Rd,b

Bit load from register to T

Rd(b) = T

None

1

SEC

None

Set carry flag

C =1

C

1

CLC

None

Clear carry flag

C = 0

C

1

SEN

None

Set negative flag

N = 1

N

1

CLN

None

Clear negative flag

N = 0

N

1

SEZ

None

Set zero flag

Z = 1

Z

1

CLZ

None

Clear zero flag

Z = 0

Z

1

SEI

None

Set interrupt flag

I = 1

I

1

CLI

None

Clear interrupt flag

I = 0

I

1

SES

None

Set signed flag

S = 1

S

1

CLN

None

Clear signed flag

S = 0

S

1

SEV

None

Set overflow flag

V = 1

V

1

CLV

None

Clear overflow flag

V = 0

V

1

SET

None

Set T-flag

T = 1

T

1

CLT

None

Clear T-flag

T = 0

T

1

SEH

None

Set half carry flag

H = 1

H

1

CLH

None

Clear half carry flag

H = 0

H

1

NOP

None

No operation

None

None

1

SLEEP

None

Sleep

See instruction manual

None

1

WDR

None

Watchdog Reset

See instruction manual

None

1



2. AVR ASM 에서 사용하는 예약어.

 

1) BYTE  byte 변수 지정
            
.DSEG 
            
var1:    .BYTE 1            ; reserve 1 byte to var1 

2) CSEG - Code segment 지정

 

3) DB - Define constant byte(s) in program memory and EEPROM

            .CSEG 
            
consts: .DB 0, 255, 0b01010101, -128, 0xaa

            .ESEG 
            
const2: .DB 1,2,3

 

4) DEF - Set a symbolic name on a register

            .DEF temp=R16
            .DEF ior=R0

 

5) DEVICE - Define which device to assemble for

            Syntax: 
            
.DEVICE AT90S1200 |AT90S2313 | AT90S2323 | AT90S2333 | AT90S2343 | AT90S4414

            | AT90S4433 | AT90S4434 | AT90S8515 | AT90S8534 | AT90S8535 | ATtiny11 | ATtiny12

            | ATtiny22 | ATmega603 | ATmega103

            Example:

            .DEVICE AT90S1200  ; Use the AT90S1200

 

6) DSEG - Data Segment

            .DSEG                        ; Start data segment

            var1:  .BYTE 1               ; reserve 1 byte to var1 
            
table:  .BYTE tab_size       ; reserve tab_size bytes.

 

7) DW - Define constant word(s) in program memory and EEPROM

            .CSEG 
            
varlist:  .DW 0, 0xffff, 0b1001110001010101, -32768, 65535

            .ESEG 
            
eevarlst: .DW 0,0xffff,10

 

8) ENDMACRO - End macro

            .MACRO SUBI16               ; Start macro definition 
                                subi r16,low(@0)    ; Subtract low byte 
                                sbci r17,high(@0)   ; Subtract high byte 
            
.ENDMACRO

 

9) EQU - Set a symbol equal to an expression

            .EQU io_offset = 0x23 
            
.EQU porta     = io_offset + 2

 

10) ESEG - EEPROM Segment

            .ESEG 
            
eevar1: .DW 0xffff        ; initialize 1 word in EEPROM 

 

11) EXIT - Exit this file. 이 예약어 이후의 코드는 어셈블하지않는다.

 

12) INCLUDE - Include another file

 

13) LIST - Turn the listfile generation on

            .NOLIST                ; Disable listfile generation 
            
.INCLUDE "macro.inc"   ; The included files will not 
            
.INCLUDE "const.def"   ; be shown in the listfile 
            
.LIST                  ; Reenable listfile generation

 

14) LISTMAC - Turn macro expansion on

 

15) MACRO - Begin macro

 

16) NOLIST - Turn listfile generation off

 

17) ORG - Set program origin

 

18) SET - Set a symbol equal to an expression

            .SET io_offset = 0x23 
            
.SET porta     = io_offset + 2

            .CSEG                 ; Start code segment 
                                clr r2        ; Clear register 2 
                                out porta,r2  ; Write to Port A

위로 스크롤