우리가 C언어에서 변수를 선언 할 때 어떤 메모리 공간에 변수를 넣을지 모른 상태로 그냥 선언을 한다.
그러나 메모리단위로 제어를 하는 MCU에서는 특정 공간을 지정 후 변수선언을 하든지 연산을 해야한다.
기본적인 어셈블리명령어와 문법을 알아보자.
1. LDI Rd, K : 상수 K를 Rd에 대입(Load Immediate, Rd <- K)
여기서 레지스터라는 개념이 중요하다.
레지스터란 쉽게 저장공간이라고 생각하면 되며 ATmega128에는 총 64개의 레지스터가 있으나 우리가 직접 제어를 할 수 있는 레지스터는 32개이다.(나머지는 특정기능을 갖고있음) 따라서 R0 ~ R31로 표현 가능하다.
2. ADD Rd, Rr : Rd와 Rr을 더해서 Rd에 대입(Rd <- Rd + Rr)
C언어에서 b=b+a;와 비슷한 구문이다.
ex) LDI, ADD를 사용한 예제
LDI R0, 1
LDI R1, 2
LDI R2, 3
LDI R3, 4
LDI R4, 5
ADD R1, R0
ADD R2, R1
ADD R3, R2
ADD R4, R3
사실 R0 ~ R15는 범용레지스터로 사용 할 수 없지만 초반편의상 임의로 사용하였다. 이에 대한 내용은 OPcode를 다룰때 자세히 설명하자.
3. CP Rd, Rr : Rd와 Rr을 비교한다.
비교 후 다음 수행동작을 알려준다.
1) 조건
BREQ : 같다면(equal)
BRNE : 같지 않다면(not equal)
BRGE : 크거나 같다면(greater than or equal)
BRLT : 작다면(less than equal)
ex) C언어를 어셈블리어로 바꿔보자
오른쪽 코드에서 R0과 R1을 비교 후 BRGE를 만나게 된다. 이 BRGE(크거나 같으면)의 조건을 만족하면 두줄을 건너 뛰어서 9번째 줄로 점프한다는 의미이다. R0=3, R1=2를 비교 하여 R0가 크기 때문에 조건만족하므로 덧셈명령을 실행하지 않는다. 다음으로 else문을 실행하면 안되기 때문에 1줄을 건너뛴 다음 작업을 이어간다.
2) 반복(do ~ while)
INC R0 : R0 +1
CPI R0, 5 : R0와 5를 비교한다.
BRLT -4 : 조건을 만족하면 아래서부터 위로 4칸 점프해라
3) 반복(while)
CPI R0, 6 : R0와 6을 비교한다.
BRGE 3 : R0가 크거나 같으면 3줄 점프, 아니면 아랫줄 실행
레지스터 & 메모리
앞서 우리가 사용할 수 있는 범용 레지스터의 개수는 32개라고 얘기했다.
이 부분에서 잘 생각해야 하는 것이 만일 32개 이상의 변수를 만든다면 더이상 못만드나?
다행히 더 많이 만들 수 있다. 이를 대비하기 위한 명령어가 바로 메모리 명령어이다.
지금까지 우리는 레지스터에 직접 값을 대입 후 연산을 했다.
그러나 이렇게 하면 나중에 공간이 부족해 질 수 있기 때문에 따로 메모리영역에 값을 저장을 한 후 연산을 할때만 레지스터로 불러오면 된다.
구조를 간단히 비유하자면 레지스터는 방안의 책장이고 메모리는 창고라고 생각하면 된다.
레지스터는 연산속도가 빠른 장점이 있는 반면 저장공간이 부족하고
메모리는 연산속도가 느리지만 저장공간이 많은 장점이 있다.
이 메모리 영역에 있는 데이터를 레지스터로 불러오고 저장하는 명령어를 알아보자.
1. STS K, Rr : K번지(주소값)에 Rr값을 대입해라(저장), (K) <- Rr
2. LDS Rd, K : K번지에 있는 값을 Rd로 불러와라(호출), Rd <- (K)
R0를 100번지, R1을 101번지라고 가정하자.
LDI를 통해 상수3를 레지스터에 저장한다.
바로 STS연산을 통해 100번지에 R0에 있던 값을 저장한다.
다음 LDI를 통해 다시 R0에 2를 저장 후 101번지에 값을 저장한다.
이로써 같은 레지스터를 공용으로 사용함을 확인 할 수 있다.
ADD연산은 서로 다른 레지스터로 갖고와서 연산 후 다시 101번지에 저장한다.
'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] AVR내부연산 & Opcode (0) | 2021.07.17 |
[µ-Processor] 입문 (0) | 2021.07.15 |