ARM System Developer's Guide
- Designing and Optimizaing System Software
#####
Data Processing instructions
Branch Instructions
Load-Store Instructions
Software Interrupt Instructions
Program Status Register Instructions
Loading Constants
ARMv5E Extensions
Conditional Execution
### 3.4. SWI 명령어
- Software Interrupt Instructions
- Software Interrupt Exception을 발생시키는 명령어
- Applications이 OS routin을 호출하기 위한 mechanism으로 사용
- "pc = vectors + 0x8" : 프로세서 모드를 "SVC"로 변경하여 OS routin이 특권모드로 호출될 수 있도록 함
- SWI_number : 특정 함수의 호출이나 특징을 나타냄
### 3.5. PSR 명령어
- Program Status Register Instruction
- ARM 명령어 세트는 PSR을 직접 제어하기 위해 MRS, MSR 명령어를 제공
MRS : cpsr이나 spsr의 내용을 레지스터로 전송
MSR : 레지스터의 내용을 cpsr이나 spsr으로 전송
* fields : control(c), extension(x), status(s), flag(f)의 어떤 조합으로 구성
- c fields : 인터럽트 마스크, Thumb 상태, 프로세서 모드를 제어어
> 예제 3.26에서 I 마스크를 클리어 하여 IRQ 인터럽트를 활성화 시키는 방법
1. MSR 명령어로 cpsr값을 r1로 복사
2. BIC 명령어로 r1의 7번째 비트를 0으로 클리어
3. r1을 cpsr로 복사하여 IRQ interrupt를 활성화
* cpsr의 다른 모든 설정값은 유지. control영역의 I 비트만 수정
## 3.5.1. 코프로세서 명령어
- Coprocessor Instruction
- 명령어세트를 확장하기 위해 사용
- 추가의 게산능력을 제공해주거나 캐시와 메모리 관리 장치를 포함한 메모리 서브시스템을 제어하기 위해 사용
- 데이터처리 명령어, 레지스터 전송 명령어, 메모리 전송 명령어
=> 코프로세서에 특화
- cp field : p0에서 p15 사이의 코프로세서의 수
- opcode field : 코프로세서 상에서 발생하게 될 동작
- Cn, Cm, Cd field : 코프로세서 안의 레지스터들을 의미미
- Coprocessor 15(CP15)는 메모리 관리장치, 쓰기버퍼제어, 캐시제어, 고유 레지스터 할당(identification registers) 같은 시스템 제어를 위해 할당됨
## 3.5.2. 코프로세서 15 명령어 표기법
- Coprocessor 15 Instruction Syntax
- CP15 : 프로세서 코어를 설정하고 설정정보를 저장하기 위한 전용 레지스터 세트를 가짐
=> "시스템 컨트롤 코프로세서"
- MRC와 MCR 명령어로 CP15를 read/write
- Rd : 코어 결과 레지스터
- Cn : 기본 레지스터
- Cm : 보조 레지스터
- opcode2 : 보조레지스터를 수정하는 용도
- 확장 레지스터라는 보조 레지스터가사용되기도 함
"MCR p15, 0, r1, c1, c0, 0"
"MCR 코프로세서 번호, 무조건 0, 레지스터번호, Coprocessor의 레지스터번호, c0, 무조건0"
=> 간략한 표기법
"CP15:cX:cY:Z"
"CP15 : cX : cY : Z"
"코프로세서 번호, 기본레지스터(X:0-15사이의 값), 보조레지스터or확장레지스터(Y:0-15사이의 값), opcode2(0-6)"
참고. http://dreamlog.tistory.com/221
### 3.6. Loading Constants
: 상수값 로드
: ARM 명령어 세트에서 32-bit 상수값을 레지스터에 저장하는 명령어는 없음
=> 명령어는 32-bit 이기때문에, ARM명령어가 32비트의 상수값을 포함할 수 없음
=> 2가지 의사명령어를 제공하여 ARM은 32-bit value를 레지스터에 저장할 수있게함 (플밍이 쉬워짐)
- LDR : 가능한 명령어들의 조합을 이용하여 32비트값을 레지스터에 저장
만약 상수값을 다른 명령어들의 조합으로 만들 수 없을 땐, 메모리를 직접 액세스하여 읽음
- ADR : 상대 주소를 레지스터에 저장. pc 상대 주소 표현법을 사용하여 해석
pc 상대 덧셈, 뺄셈을 이용하여 주어진 레이블의 주소를 레지스터 Rd에 저장
> 32비트 상수값 0xff00ffff를 레지스터 r0으로 읽는 LDR 명령어
-----------------------------------------
LDR r0, [pc, #const_number-8-{pc}]
.
const_number
DCD 0xff00ffff
-----------------------------------------
- 상수값 로드를 위해 메모리에 액세스 (시간에 민감한 루틴에서는 큰 손실이 발생)
> MVN 명령어를 이용하여 상수 0xff00ffff를 레지스터 r0에 로드
-----------------------------------------
PRE none...
MVN r0, #0x00ff0000
POST r0 = 0xff00ffff
-----------------------------------------
- 컴파일러와 어셈블리는 가능한 메모리에서 상수값을 로드하는 걸 피하기 위한 테크닉을 사용
- 한 레지스터안에서 상수값을 만들고, 배럴 시프터를 사용해 확장시키는데 필요한 최적의 명령수를 찾는 알고리즘을 가짐
- LDR 명령어는 상수값을 만들기 위해 MVN, MOV 명령어를 삽입하거나,
코드내에 literal pool에서 상수값을 읽기위해 pc 상대 주소를 갖는 LDR 명령어를 만들어 냄
# 의사 명령어의 변환
1. MOV 명령어를 만듬
2. pc상대 주소를 이용한 LDR 명령어를 생성
### 3.7. ARMv5E Extensions
- 새로운 많은 명령어들을 제공
- signed MAC 명령어 : 16비트 데이터를 가지고 처리가 가능한 곱셈계산 명령어로 16비트 데이터조작에 유연성과 효율성을 제공
* MAC : Multiply Accumulate
* 16비트 데이터 조작은 16비트 디지털 신호 처리와 같은 applications를 위해 중요한 요소
- 많은 ARMv5E 제품군에서는 MAC 명령어들이 한 사이클에 실행
> ARMv5E에서 제공하는 새로운 명령어
## 3.7.1. CLZ 명령어
- Count Leading Zeros Instruction
- 최상위 비트에서 처음으로 1이 나온 비트 사이에 0이 몇개나 있는가를 세는데 사용
> Example 3.30 <
PRE r1 = 0b00000000000000000000000000010000 ; 0이 27번 나온 후 1이 나옴
CLZ r0, r1
POST r0 = 27
* 정규화 루틴에서 유용함
## 3.7.2. 포화 산술 연산
- Saturated Arithmetic
- 보통의 ARM 산술 연산 명령에서는 32비트 정수값에 오버플로우가 발생하면, 제대로된 처리를 못함
ex. 0x7fffffff + 1 = -0x80000000
=> ARMv5E의 명령어를 사용하여 결과값을 포화시킴. 오버플로우가 발생하면 결과는 가장 큰 정수값으로 저장(0x7fffffff)
(오버플로우 체크를 위해 추가적인 코드가 필요없어짐)
## 3.7.3. ARMv5E 곱셈 명령어
- x,y : 32비트 레지스터에서의 첫번째 16비트를 사용할지, 두번째 16비트를 사용할지 선택
상위 16비트 : "T"
하위 16비트 : "B"
- 32bit의 결과를 생성하는 MAC연산에서 Q flag는 덧셈결과(signd 32bit value)에 오버플로우가 발생했는지의 여부를 나타냄
- 향상된 곱셈 명령어는 16비트값의 곱셈에서 나은 유연성을 제공
### 3.8. 조건부 실행
- 대부분의 ARM명령어는 조건부로 실행이 가능
- 주어진 조건이나 task 상황을 만족 할 때만 명령어가 실행되도록 설정해야 함
- 조건부 명령어의 사용은 성능 및 코드의 직접도를 향상
- AL(always) 조건문자 : 명령어 니모닉뒤에 붙어 항상 실행하라는 의미를 가짐
- 조건부의 실행은 분기 상황을 감소시켜 파이프라인이 깨지는 수를 줄여줌
=> 코드의 성능 향상
- 조건 필드와 상태 플래그에 영향을 받음
조건필드 : 명령어상에 위치
상태플래그 : cpsr
- 특정한 알고리즘을 수행하는 데 필요한 명령어의 수를 상당량 줄여줌
'System > Embedded' 카테고리의 다른 글
[ARM] 익셉션과 인터럽트 처리 (0) | 2015.11.10 |
---|---|
[ARM] 최적화된 C프로그래밍 (0) | 2015.11.10 |
[ARM] 32비트 ARM 명령어 (0) | 2015.11.09 |
[ARM] ARM 프로세서 개요 2 (0) | 2015.11.09 |
[ARM] ARM 프로세서 개요 (0) | 2015.11.09 |