DynamicRC 광팬 커뮤니티에 오신 것을 환영합니다!
DynamicRC 광팬 커뮤니티

게시판 통합검색 help
subject/ name/ content/ comment

공지사항 자유게시판 QnA 제작일지 비행일지
RC전자공작 MCU STUDY IR·RF 자료실 Link 옛날 프로젝트룸

* *

 【 찌파의 AVR 강좌 3 】많은 명령어들과 조금씩 친해지기.

2009-05-03 09:09:26, Hit : 8686

작성자 : 찌파

어셈블리를 한번쯤 보신 분들은 외계어 같은 많은 명령어들을 보셨을 겁니다. 사실 어느게 명령어인지도
모르는 경우도있죠.   그래서 미리 겁먹고 접근을 시도하지 않았을 겁니다.

C의 예약어는 약 50종,   PIC명령어가 40종도 안된다고 하는 것에 비해 AVR이 120종이라면 상당히 많은
명령어 입니다.  하지만 AVR의 데이타쉬트에서는 이 풍부한 명령어수를 자랑으로 내놓고 있더군요.
반면 PIC는 적은 명령어 수를 자랑으로 내놓고 있지요.   

처리속도 면에서 AVR이 앞서는 이유가 이 풍부한 명령어에 있다고 봐야 합니다.
PIC는 명령어수를 줄이는 대신 하나의 명령어를 처리하기 위해 적어도 클럭이 4번 뛰어야 합니다.
AVR은 적게는 1클럭만을 필요로 합니다.  만약 같은 1MHZ의 SYSTEM CLOCK을  사용한다고 보면
AVR이 PIC보다 4배정도 처리속도가 빠르다는 거죠.

이렇게 빠른 처리를 하기위해서는 명령어(=기계어)의 수를 더 늘릴 필요가 있었을 겁니다.

명령어의 종류를 살펴볼까요? 크게는 다음과 같이 분류할 수 있습니다.

1. 산술 및 논리 연산명령들
2. 분기 명령들
3. 데이타 이동 명령들
4. 비트취급 명령들


몇개만 심층분석해보지요. 오늘은  연산명령을 해봅시다.

ADD      Rd, Rr


ADD는 명령어고, Rd, Rr은 레지스터 명입니다.
도움말 자료에는 Rd라고 표기된 것도 있고 Rr이라고 표기된 것도 있습니다.
모두 레지스터명을 뜻하는 것이지만 의미가 다릅니다.

Rd : Destination (and source) register in the register file
Rr : Source register in the register file
번역하자면 Rd는 목적레지스터라 하고, Rr는 소스 레지스터라 합니다.

ADD 명령은  'Add without Carry' 의  연산을 수행하며, 그 뜻은
' 케리플래그와 상관없이 덧셈한다.' 입니다.


그 의미를 좀더 쉽게 설명을 해보겠습니다.



자. 여기서 Rd는 결과값이 적용되는 레지스터라고 보시면되고, Rr는 단지 소스만 제공하는
레지스터라고 보시면 되겠습니다.

"그럼 Rr의 값은 안 지워지는거야?"
- 예. 그대로 남아있습니다. 지워진건 덮어쓰기한 Rd의 기존값 뿐입니다.

이렇게 덧셈이나 뻴셈처럼  어떤 레지스터의 내용에
변화를 가져오는 명령어들은 Status Register에 그에 따른 변화가 적용됩니다.

"Status Register 는 또 뭐야?"

말뜻은 '상태 레지스터' 이고, 아래 그림처럼 CPU텝 안에 떡하니 자리 잡고있습니다. 
8개의 비트마다 그 의미가 있지요.



Set Nomenclature:

 
Status Register (SREG)
SREG : Status register

C : Carry flag in status register

Z : Zero flag in status register

N : Negative flag in status register

V : Two's complement overflow indicator

S : N [+] V, For signed tests

H : Half Carry flag in the status register

T : Transfer bit used by BLD and BST instructions

I : Global interrupt enable/disable flag


SREG 레지스터의 값은 우리가 원하든 원치않든 연산을 수행하면 그 결과에 따라 자동으로 바뀝니다.
어떤 명령어는 SREG레지스터에 영향을 안주는 것도 있고 어떤 것은 부분적으로 영향을 주기도 합니다.
어디에 영향을 주는지 나타내는 것이 표의 Flag란에 표기되어 있음을 알 수 있습니다.
혹은 명령어 개별도움말에서도 찾아 볼 수 있습니다.

" 이딴 것들이 바뀌는 것이 나랑 무슨 상관이야."   

지금 당장은 마음대로 생각하세요. 



위 도움말을 살펴보면  Rd <- Rd + Rr 이라고 표기된 부분이 연산동작을 의미있게 표현한 부분입니다.

Operands :     0 ≤ d ≤ 31,      0 ≤ r ≤ 31 

Rd 레지스터의 역할로 이용할 수 있는 레지스터는  0~31 까지 이다.

Rr 레지스터의 역할로 이용할 수 있는 레지스터는  0~31 까지 이다.

라고 표현 한 것입니다. 어떤 명령어( LDI, ORI, ANDI, ...)는  16 ≤ d ≤ 31, 로 표현된 것도
있습니다. 앞전 강좌에서 LDI 명령을 쓸때   R16번 레지스터를 이용했던 것이 그런 이유 때문입니다.

그 다음으로,   PC <-  PC + 1 의 뜻은

이 명령을 수행하고 나면 프로그램 카운터가 1 증가 한다는 뜻입니다.  연산 명령에서는 매번 1씩 증가한다는
표기만 있으나, 분기 명령에서는 다양하게 적용됩니다.

Example 은 간단한 사용예를 나타내고 있으며,  간단한 주석도 달려있습니다.
Words 는 이 명령어의 크기를 나타내며, 이것은 프로그램 메모리를 얼마나 차지하는지를 나타내고 있습니다.
Cycles 는  명령을 수행하기 위해 필요한 Cycle수를 표기한 것입니다. AVR에서는 Cycle수 = Clock 수입니다.
다시 말해서 펄스 한번 뛰면 이 명령은 수행된다는 뜻이며 처리 속도와 상관이 있는 부분입니다.

   R1, R2에 각각 0과 1이 들어있다고 가정 할때,

    ADD     R1, R2
    ADD     R1, R2
    ADD     R1, R2
    ADD     R1, R2
    ADD     R1, R2

    이 연산을 모두 수행한  결과 최종 R1의 값은?    

    처음문장은 0+1의 값이 R1에 적용될 것이고, 다음은 R1 <--  1+1, 다음은 R1 <--  2+1...
    한 문장이 수행될 때마다 1씩 증가하는 거죠.
    
    답은 5죠.

    많이 어렵나요?

ADD는 덧셈명령이며,
SUB는 뺄셈 명령이며,
MUL은 곱셈명령이며................나눗셈 명령어는 존재하지 않습니다.

    INC :  레지스터 값을 1씩 증가시킨다.
    DEC : 레지스터의 값을 1씩 감소시킨다.

    OR : 논리 합 연산.
    AND : 논리 곱 연산.
    COM : 1의 보수 ( = 비트반전 연산)

    CLR : ???  (도움말 참고하셔서 알아보세요.)

-------------------------------------------------------------------------------
Registers and Operands

Rd : Destination (and source) register in the register file
Rr : Source register in the register file
R : Result after instruction is executed
K : Constant data
k : Constant address
b : Bit in the register file or I/O register (3 bit)
s: Bit in the status register (3 bit)
X,Y,Z : Indirect address register  (X=R27:R26, Y=R29:R28 and Z=R31:R30)
A : I/O location address
q : Displacement for direct addressing (6 bit)


The Assembler is not case sensitive.
The operands have the following forms:

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)



자, 오늘 배운 명령어를 토대로 문제 나갑니다.  10분안에 풀면...
아니, 오늘안에 풀면 당신은 프로그래밍 천재입니다.

단 2개의 레지스터( r1, r2)만 존재한다고 가정합니다.
r1, r2 에는 서로다른  어떤수 가 들어 있습니다.
AVR의 명령어을 이용하여 레지스터의 내용물을 바꿔보세요.

조건)
1. 제3의 레지스터는 존재하지 않는다.
2. AVR명령어는 아무거나 여러번 쓸 수 있다.
3.    0 ≤ 어떤수 ≤ 50   사이의 자연수.
          
정답은 다음 강좌에서...




윤영준
add r1, r2
inc r1
dec r2
add r1, r2
뭐 이렇게 하면 값이 바끨거 같은데...
2009-05-03
18:36:20

수정 삭제
김창문
어렵네요, 머리가 굳어서.... 밑에것이 맞는지?

.include"tn25def.inc"
;--------사용자 정의 숫자 -----

.equ PORT_DEF = 0b00101000 ; 0x28
.equ port2 = 0b00010000 ;0x10

;--------레지스트 정의 -----
.def temp =r16
.def temp2 =r17

;==============================
; Main
;==============================
main:
ldi temp ,PORT_DEF
ldi temp2,port2
add r17,r16 ; 0x28 + 0x10
out PORTB,temp2 ; 0x38 출력
2009-05-04
03:02:47

수정  
찌파
MOV라는 명령어가 register에서 register로 값을 복사하할 때 사용합니다.
예를 들어 r2값을 r1으로 복사한다면 mov r1, r2
2009-05-04
09:28:48

수정 삭제
찌파
윤영준님 AVR studio4를 가동시켜 위의 코드를 입력하고, register에 적절한 값을 넣은다음 시뮬레이션
해보세요. 원하는 결과값이 나오면 맞는거겠죠.
2009-05-04
09:47:18

수정 삭제
김창문
아래처럼 되는건가요?
.include"tn25def.inc"
;--------사용자 정의 숫자 -----

.equ PORT_DEF = 5;자연수
.equ port2 = 17;자연수
;--------레지스트 정의 -----
.def temp =r16
.def temp2 =r17
.def temp3 =r2
;==============================
; Main
;==============================
main:
ldi temp,port2
mov temp3,temp
r2에 copy되는군요
2009-05-05
02:32:20

수정  
찌파
아무래도 이 문제의 답은 한글로 3글자 인듯 합니다. 2009-05-06
00:39:30

수정  

【 찌파의 AVR 강좌 4 】많은 명령어와 친해지기-매크로 맛보기 [8]
【 찌파의 AVR 강좌 2 】LED없이 LED 제어가 돼? 어. 돼! [7]

Copyright 1999-2020 Zeroboard / skin by 또미
Copyright 2003-2010 DYNAMICRC.COM All rights reserved