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

+ Recent posts