728x90

프로세서 명령어 구조

- 프로그래머 모델중 가장 중요한 요소

- 프로세서를 이해하는 출발점

- 인라인 어셈블리 프로그래밍/ 어셈블리 수준 소스 디버깅

- 프로세서 명령어 문법과 사용법을 알아야함

 

ARM 명령어 세트

- RISC 간략하고 적은수 명령어

- 고유 특징 : 모든 명령어를 조건부 명령어 -> 분기 명령어 실행 속도 향상

- 16/32비트 명령어 함께 사용 -> 프로그램 코드 크기 절약

=> 임베디드 시스템의 메모리 자원 제약 극복

 

(1) ARM 명령어 1

1) 명령어 형식

2) 조건 필드

3) 명령어 요약

4) 데이터 전송 명령어

 

1) 명령어 형식

명령어 형식

- 명령어 길이 : 32비트로 동일

- 최상위 비트에 조건부 명령 실행을 결정하는 4비트 조건 필드 -> 조건을 만족해야 명령어 실행 가능

- opcode : 명령어 동작을 정의한 코드

- Rn, Rd, Rs : 명령어 실행에 필요한 오퍼랜드를 저장한 레지스터 정의 

ARM 명령어 형식

 

2) 조건 필드 condition field

- 명령어 실행 여부를 판단하는 조건 -> 만족시 실행

- 조건 필드는 CPSR의 조건 플래그들 참고

- 조건 필드값과 명령어에 상요되는 접미사 및 조건 플래그

- ADD R0, R1, R2 : 명령어의 실행 조건이 이전 결과가 음수라는 조건인 경우

 => ADDMI R0, R1, R2가 된다.

명령어 조건 필드

 

3) 명령어 요약

명령어 요약

- ARM 명령어는 아래의 4가지로 분류 가능. ARM7TDMI 명령어 세트 예시임. 상위 버전은 추가 명령어 사용 가능

- 데이터 전송 : 메모리와 레지스터, 메모리-상태 레지스터 사이 데이터전송  LDR, LDRB ...

- 데이터 처리 : ALU와 곱셈기를 사용해 처리 - ADD, ADDC, ...

- 프로그램 제어 : 프로그램 흐름제어 - BL, BX, SWI

- 부프로세서 : 부프로세서 제어 및 부프로세서와 데이터 전송을 위한 명령어 CDP, LDC, STC, ...

 

 

4) 데이터 전송 명령어 유형

- 메모리와 데이터 사이 데이터 전송 실행

1. 단일 데이터 전송 명령여(워드 및 바이트 단위)

2. 하프워드 및 signed 데이터 전송 명령어

3. 블록 데이터 전송 명령어(여러 데이터를 차례로 전송)

4. 상태 데이터 전송명령어(상테레지스터 메모리 저장 및 복구) 

5. 데이터 스왑 명령어(메모리 저장 데이터와 레지스터 교환)

 

단일 데이터 전송 명령어

- 4바이트 워드, 1바이트 데이터를 메모리-레지스터 사이 전송

- Rn : 베이스 레지스터

- Rd : 소스 or 목적 레지스터

- Offset : 인덱스 어드레싱을 워함

- 플래그들

  I :인덱싱 오프셋 값이 상수값인지 레지스터에 저장된 값인지

  P :인덱스 어드레싱 시점을 지정. 1이면 전송전 어드레스값 계산 0이면 전숭후 계산

  W : 1인 경우 베이스 레지스터에 저장

  U : 베이스 레지스터에서 오프셋을 뺄지 더할지 결정

  B : 1이면 바이트 단위 전송

  L : 데이터 전송방향. 1일시 메모리 -> 레지스터. 0인경우 레지스터 ->메모리로 전송

어드레싱 방법 : Index 어드레싱(유효 어드레스=베이스 레지스터 + 오프셋)

1. pre indexed : 명령어 실행에 필요한 어드레스를 실행전에 계산

2. pre indexed auto update : pre indexed와 동이랗나 베이스 어드레스값 갱신

3. post indexed : 명령어 실행후 유효 어드레스를 계산하여 베이스 어드레스 갱신

4. PC relative : 현재 프로그램에서 오프셋 만큼 떨어진 메모리 장소에 저장된 데이터 엑세스

 

오프셋값 유형

- unsigned 12비트

- 레지스터 Rm 값 지정

- 레지스터 Rm 만큼 shift 방법

 

명령어 예제

1. LDR R0, [R1, R2] : (R1+R2) 어드레스에 저장된 데이터를 R0에 저장

2. LDR R0, [R1, #4]! : R1+4 어드레스에 저장된 데이터를 R0로딩후에 R1=R1+4로 갱신

3. STR R0, [R1], R2 : R0 값을 (R1+R2) 어드레스에 저장 후 R1=R1+R2로 갱신

 

하프워드 및 signed 데이터 전송 명령어

- 하프워드를 메모리와 레지스터 사이에서 전송

- 명령어 형식 : 인덱스 어드레싱에 오프셋 지정 방법에 따라 나뉨

1. 레지스터를 사용하여 오프셋 지정

2. 명령어내 8비트 상수 지정

어드레싱 방법 : 단일 데이터 전송 명령어와 동일

 

블록 데이터 전송 명령어

- 레지스터와 메모리 사이의 데이터 블록 전송

- 여러 레지스터 값을 베이스 레지스터가 지정한 어드레스를 시작 어드레스로 하는 메모리 공간에 써넣음

- 메모리 저장된 값을 차례로 읽어 레지스터들에 로딩하는 작업 실행

명령어 형식 : 레지스터 리스트 필드에 비트맵 형식으로 지정

상태 레지스터 전송 명령어

- 상태 레지스터와 범용 레지스터 사이 데이터 전송

- 상태 레지스터의 조건 플래그를 상수 값이나 레지스터 값으로 변경시 사용

- MRS 명령어 : 상태 레지스터 값 -> 범용 레지스터 값으로

- MSR 명령어 : 범용 레지스터 값 -> 상용 레지스터값

 

데이터 스왑 명령어

- 레지스터와 메모리 사이 데이터 교환

- 실행 중인동안 메모리 일긱와 쓰기 동작인 Lock 상태 - 인터럽트 금지로 정상적인 동작 보장

- 소프트웨어 세마포어 구현에 적합

 

(2) ARM 명령어 2

1) 데이터 처리 명령어

2) 프로그램 제어 명령어

3) 부 프로세서 명령어

 

1) 데이터 처리 명령어

- 산술 연산 + 논리연산 + 곱셈 연산

- 하드웨어 32비트 곱셈과 MAC 연산과 64비트 곱셉 지원

 

산술/논리 연산 명령어

- 3 오퍼랜드 명령어

- opcode : 산술/논리연산 유형 선택

- s 플래그 : 상태 레지스터 조건 코드 갱신 여부 결정.

명령어 형식
opcode 필드

 

2) 프로그램 제어 명령어

- 분기 명령어 : B, BL (분기 및 링크 레지스터를 사용한 분기)/ BX(프로세서 state 변경을 통한 분기)

- 기타 프로그램 제어 명령어 : SWI(소프트웨어 인터럽트), Undefined

 

Thumb 명령어 세트

- 자주 사용하는 32비트 ARM 명령어를 16비트로 재정의 -> 프로그램 크기 절약으로 메모리 사용량 감소

- 프로그램 작성 보다 디버깅에 주로 사용됨.

Thumb 명령어 형식

300x250

+ Recent posts