본문 바로가기

Security

[Reversing] AVR 간단 정리

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



계속 업데이트 중...