소개글
기초적인 ARM Assembly에 대하여 이해하고 기본적인 명령어 사용방법을 습득한다.주어진 코드를 보고, 그 코드에 적당한 코드를 완성시켜본다.
목차
1.TitleARM Assembly 실습 2
2.Name
3.Abstract
기초적인 ARM Assembly에 대하여 이해하고 기본적인 명령어 사용방법을 습득한다.
주어진 코드를 보고, 그 코드에 적당한 코드를 완성시켜본다.
4.Background
본문내용
1. 산술 명령어산술 명령어는 32비트 signed / unsigned 값의 덧셈과 뺄셈을 구현하기 위해 사용된다.
표기법 : <명령어> {<조건>} {S} Rd, Rn, N
ADC : 캐리를 고려한 32비트값의 덧셈 / Rd = Rn +N + C(캐리 플래그)
ADD : 32비트값의 덧셈 / Rd = Rn + N
RSB : 32비트값의 뺄셈(반전) / Rd = N - Rn
RSC : 캐리를 고려한 32비트값의 뺄셈(반전) / Rd = N - Rn - !C
SBC : 캐리를 고려한 32비트값의 뺄셈 / Rd = Rn - N - !C
SUB : 32비트값의 뺄셈 / Rd = Rn - N
2. 산술 연산에서 배럴 시프터의 사용
산술 연산이나 논리 연산에서 두 번째 오퍼랜드의 시프트가 가능하다
ex) ADD r0, r1, r1, LSL #1 => r0 = r1 + r1*2 = 3*r1
3. 논리 명령어
논리 명령어는 2개의 소스 레지스터에 비트 단위로 논리 연산을 수행한다. 논리 명령어는 접미사 S가 있을 경우에만 cpsr 플래그를 업데이트하며, 산술 명령어와 같은 방식으로 배럴 시프트된 두 번째 오퍼랜드에 사용할 수 있다.
표기법 : <명령어> {<조건>} {S} Rd, Rn, N
AND : 32비트 AND 논리 연산 / Rd = Rn & N
ORR : 32비트 OR 논리 연산 / Rd = Rn | N
EOR : 32비트 XOR 논리 연산 / Rd = Rn ^ N
BIC : 비트 클리어 (AND NOT) 논리 연산 / Rd = Rn & ~N
4. 비교 명령어
비교 명령어는 결과에 따라 cpsr 플래그 비트를 업데이터하며 다른 레지스터에는 영향을 미지치 않는다. 해당 비트들을 세트한 다음, 조건부 실행을 사용하여 프로그램의 흐름을 변경하는 데 사용한다.
표기법 : <명령어> {<조건>} {S} Rn, N
CMN : 음수 비교 / Rn + N의 결과에 따라 상태 플래그를 업데이트
CMP : 양수 비교 / Rn - N의 결과에 따라 상태 플래그를 업데이트
TEQ : 두 32비트값이 같은지를 비교 / Rn ^ N의 결과에 따라 상태 플래그를 업데이트
TST : 두 32비트값의 테스트 비트 / Rn & N의 결과에 따라 상태 플래그를 업데이트
5. 곱셈 명령어
곱셈 명령어는 두 레지스터 안의 내용을 곱하는 명령어로, 명령어에 따라 곱한 결과에 또 다른 값을 더하기도 한다. 64비트 곱셈 명령어(long multiply)는 64비트를 표현하는 2개의 레지스터를 이용하여 곱셈을 한다. 곱셈 결과는 하나의 결과 레지스터에 저장하거나 2개의 레지스터를 이용하여 저장한다.
곱셈 명령어를 실행하는 데 걸리는 사이클 수는 프로세서에 따라 다르다.
표기법 : MLA {<조건>} {S} Rd, Rm, Rs, Rn
MUL {<조건>} {S} Rd, Rm, Rs
MLA : 32비트 곱셈-덧셈 명령어 / Rd = (Rm * Rs) + Rn
MUL : 32비트 곱셈 명령어 / Rd = Rm + Rs
표기법 : <명령어> {<조건>} {S} RdLo, RdHi, Rm, Rs
SMLAL : 64비트 signed 곱셈-덧셈 명령어 / [RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs)
SMULL : 64비트 signed 곱셈 명령어 / [RdHi, RdLo] = Rm * Rs
UMLAL : 64비트 unsigned 곱셈-덧셈 명령어 / [RdHi, RdLo] = [RdHi, RdLo] + (Rm * Rs)
UMULL : 64비트 unsigned 곱셈 명령어 / [RdHi, RdLo] = Rm * Rs
6. 분기 명령어
분기 명령어는 실행의 흐름을 변경하거나 어떤 루틴을 호출하는 데 사용된다. 이런 유형이 명령어는 프로그램의 서브루틴이나 if-then-else 구조, 루프문을 사용할 수 있도록 해주며, 프로그램 카운터 pc가 새로운 주소를 가리키도록 함으로써 실행의 흐름을 바꾸어준다.
표기법 : B {<조건>} label
B : 분기 - pc = label
표기법 : BL {<조건>} label
BL : 서브루틴 호출 분기 명령어 - pc = label / lr = BL 다음 명령어의 주소
표기법 : BX {<조건>} Rm
BX : ARM/Thumb 모드 전환 분기 명령어 - pc = Rm & 0xfffffffe, T = Rm & 1
표기법 : BLX {<조건>} label | Rm
BLX : ARM/Thumb 모드 전환 및 서브루틴 호출 분기 명령어
- pc = label, T = 1 / pc = Rm & 0xfffffffe, T = Rm & 1 / lr = BLX 다음 명령어의 주소
label이 가리키는 주소는 signed pc-상대 오프셋의 형태로 명령어에 저장되며, 분기 명령어의 약 32MB 이내의 주소이어야 한다. T는 cpsr의 Thumb 비트를 의미하고, 명령어가 T를 1로 세트하면 ARM은 Thumb 상태로 바뀐다.
7. 로드-스토어 명령어
로드-스토어 명령어는 메모리와 프로세서 레지스터 사이에 데이터를 전송해준다.
8. 단일 레지스터 전송 명령어
참고 자료
http://blog.naver.com/nemco3/90001967381http://tisu.it.jyu.fi/embedded/TIE345/luentokalvot/Embedded_3_ARM.pdf
http://blog.paran.com/xscale/4260066
ARM System Developer`s Guide : Designing and Optimizing System Software