2012. 9. 24. 21:45

[ 출처 : http://clarus.tistory.com/198 ] 


본 게시물은 위에 남긴 티스토리의 내용을 개인이 공부하기 편하게 요약 정리 해 놓은 판입니다.

위에 티스토리 글이 정리가 너무나 잘되어 있어서 공부하실 때 위에 것을 참조 하시는게 좋습니다.


본 내용은 어거지성 암기법도 들어가고 필자의 추측도 들어가 있습니다.

개인 공부용이니 너무 욕하지 말아주세요~


ARM Register Structure 


 1. Branch : 가지, 지사,분기


 2. DataProcessing  :데이터의 처리

    (MOV,MVN,CMP,CMN,TST,TEQ,ADD,SUB…)


 3. Load/Store : 적재, 저장

   (LDR,ADR)


 4. SWAP  : 교환


 5. PSR(MRS,MSR)  :


 6. SWI  : swich 의약자.


 7. DCD directives


 8. EXPORT, IMPORT   : 가져오기 내보내기


위에 써진 명령어들이 큰 주제들이다. 이것들을 하나씩 봐보도록 하겠다. 


[branch]  : 지사, 분기   (여기서는 분기란 의미로 사용 된다고 보면 편하다.)


     약어 : B(Branch) , L(Labeling) , X(eXchange)


B _printf ; _printf 로 점프하라


BL _printf ; R14 돌아올 주소를 Labeling 해놓고 이동한다.


BX _printf ; 현재 모드를 exchange 한다. (X : eXchange)


BLX _printf ; 두개의 짬뽕

 


 [Data Processing] : 데이터 처리 


  약어 : MOV(Move) , CMP(Compare) , MVN (MoVe NULL),SUB(SUBtraction), RSB(Reverse SuBstraction), ADD(Addition), BIC (Between ~~~)


[명령어 , 대상 레지스터 , 장난레지스터, 레지스터 or]

MOV R1,R2   ; R1:=R2

MVN R1,#0 ; R1:=0xFFFFFFFF

ADD R0,R1,R2 ; R0:=R1+R2

SUB R0,R1,#5  ; R0:=R1-5

RSB  R0,R2,R3 ; R0=R3-R2  (Reverse Sub)

AND R0,R2,R3 ; R0:=R2&R3

BIC  R0,R2,R3  ; R0:=R2 & ~R3 (R31이 들어있는 filed0)

CMP  R0,R2   ; R0>R2 면 다음조건에서 큰경우, 아니면 작은경우



 [Load / Store]

 

   약어  : LDR(LoaD Register), STR(STORE Register), B(Byte)


포인터와 비슷한 개념!!  : [Rn]=*RN    [] 주소값! *는 가르키는 곳!


LDR  : LoaD Register(주소 값을 담음)

Ex)LDR Rd,[Rn,offset] ; Rd:=*(Rn+offset)

LDR Rd,[Rn,offset]!   ;  Rn:=Rn+offset,Rd=*(Rn 대상값을 업데이트!

STR Rd,[Rn,offset] ; *(Rn_offset) = Rd (적재!)

LDRB (LDR 의 바이트코드)


STRB (STR의 바이트 코드)  



[SWAP]

  약어 : SWP (SWAP)


일반 메모리 영역과 register 를 바꿔 치기하는데 사용됨!

Ex)SWP R0,R1,[R2] : R0 = *(R2),*(R2)=R1


[R2] R0에 저장해 두고, [R2]R1을 넣음.


한데 R0R1에 넣진 않음..(why?!)



[PSR]


  약어 : CPSR(Copy ProceSs Register), SPSR


CPSR SPSR 두 개와 일반 Register사이의 값을 서로 복사 할 수 있는 명령어들

MRS R5,CPSR  : R5 : =CPSR

MSR CPSR,R5  : CPSR : = R5

S = PSR 을 의미하고 RRegister를 의미

Move Register PSR 이런 식으로 해석

CPSR_c(control)

CPSR_f(flag)

CPSR_cf(control,flag) 로 준비되어 있음.


  [SWI] : SoftWare Interrupt



Soft Ware Interrupt 명령은 Software가 일부러 Exception을 발생시킬수 있는 유일한 명령어.


보통 user mode 에서 다른 모드로 전환할때 사용. 가장 큰 용례로 kernel SVC mode 일반 application은 
user Mode 일때 일반 applicationkernel에게 뭔가 부탁할때 쓰임

EX) SWI 0x11 : Software Interrupt Handler 에서 0x11 번재 case를 호출함.





  [DCD] : Data Calloc Dimention


DCD  를 만나면 Data Calloc DIMENSION ~ 메모리를 배열처럼 할당해 주는 기분이다.

(여러 개를 늘어놓으면 여러 개의 ARRAY처럼 쓸 수 있다.)

DCB  1Byte 짜리 Data

DCW 2Byte 짜리 Data

DCD 4Byte 짜리 Data (& 값처럼 값을 미리 넣어둘 곳을 지정 가능)

DCQ 8Byte 짜리 Data (static으로 선언해주는 듯이 사용가능)

DCD&와 같다. 메모리 영역에 내가 원하는 값을 넣어 놓도록 메모리를 확보해 놔!



1차적으로 이해가 제대로 된부분은 여기까지라 여기까지만 정리해보고..담은 분석부터 차근차근!!

기대기대~




Posted by k1rha