AVR Assembler Instructions 정리
갑자기 AVR 인스트럭션 글을 왜 쓰냐면, Reversing.kr CustomShell 문제도 있고 요즘 AVR 개발에도 도전 해 보려고 해서
먼저 asm code 정도 겸사겸사해서 공부를 해 보려고 야매노트식으로 적어봅니다.
1. AVR 이란?
간단하게 AVR(이거 사람이름이 약자) 은 ATMEL 사에서 만든 RISC 구조의 MCU 입니다.
장점으로는 1 cycle 에 1 instruction 이 실행되 빠름빠름 합니다. ( 비싸다는게 단점 )
그리고 1개의 타입의 MCU 만이 존재하는게 아니라 크게 3가지 계열로 나눠 볼 수 있는데
ATmega, ATtiny, AT90s
이렇게 존재한다고 합니다.
또 각 계열마다 버전? 도 다르고요..
2. 주로 쓰는 Instructions
clr : 하위바이트 지우기
ex) clr r29
brme : 만약 안같으면 ... 를 실행
ex) loop:
cpir r27, 5 // 이 명령어는 레지스터하고 값 비교할 때 쓰는거
brne loop // 같으면 다음 으로 아니면 이거 실행
cp : low byte 를 비교한다
cpc : high byte 를 비교한다.
r3:r2 와 r1:r0 을 비교
ex) loop:
cp r2, r0 // low byte 비교
cpc r3, r0 // high byte 비교
brne loop // 만약 안같으면 loop 로 같으면 다음 인스트럭션으로
cpse : 두 값이 같으면 다음 인스트럭션을 생략한다.
ex) cpse r2, r3
lds r2, $0xff12 <- 실행안됨
nop <- 여기부터 다시 실행
lds : x위치에 있는 데이터를 불러옴
ex) lds r2, $0xff00
ldi : 8bit 데이터를 바로 불러드림 ( mov 같은 명령어? )
ex) ldi r21, 0
ld : 데이터를 바로 불러드림 + 외부 변수?를 사용해서
ex) ld r28, Z+
ex) ld r29, -Z
lsr : 해당 레지스터 2로 나누기
asr : 해당 레지스터 2로 나누기
ex) lsr r19 // r19:r18 을 2로 나누기
ror r18 // r19:r18 은 unsigned 2byte 정수
asr r17 // r17:r16 을 2로 나누기
ror r16 // r17:r16 은 signed 2byte 정수
% r28 : low byte, r29 : high byte
% Z+ -> Z++, -Z -> --Z, Z+2 -> Z += 2 ( C언어에서 보는 연산자와 비슷 )
S for Space -> 공간가 관련된 인스트럭션
I for Immediate -> 즉시 계산한다는
n for not -> 아니라능 ㅋㅋ
e for equal -> 같다
Reference : http://www.atmel.com/webdoc/avrassembler
계속 업데이트 중...