프로세서 명령어 구조
- 프로그래머 모델중 가장 중요한 요소
- 프로세서를 이해하는 출발점
- 인라인 어셈블리 프로그래밍/ 어셈블리 수준 소스 디버깅
- 프로세서 명령어 문법과 사용법을 알아야함
ARM 명령어 세트
- RISC 간략하고 적은수 명령어
- 고유 특징 : 모든 명령어를 조건부 명령어 -> 분기 명령어 실행 속도 향상
- 16/32비트 명령어 함께 사용 -> 프로그램 코드 크기 절약
=> 임베디드 시스템의 메모리 자원 제약 극복
(1) ARM 명령어 1
1) 명령어 형식
2) 조건 필드
3) 명령어 요약
4) 데이터 전송 명령어
1) 명령어 형식
명령어 형식
- 명령어 길이 : 32비트로 동일
- 최상위 비트에 조건부 명령 실행을 결정하는 4비트 조건 필드 -> 조건을 만족해야 명령어 실행 가능
- opcode : 명령어 동작을 정의한 코드
- Rn, Rd, Rs : 명령어 실행에 필요한 오퍼랜드를 저장한 레지스터 정의
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 플래그 : 상태 레지스터 조건 코드 갱신 여부 결정.
2) 프로그램 제어 명령어
- 분기 명령어 : B, BL (분기 및 링크 레지스터를 사용한 분기)/ BX(프로세서 state 변경을 통한 분기)
- 기타 프로그램 제어 명령어 : SWI(소프트웨어 인터럽트), Undefined
Thumb 명령어 세트
- 자주 사용하는 32비트 ARM 명령어를 16비트로 재정의 -> 프로그램 크기 절약으로 메모리 사용량 감소
- 프로그램 작성 보다 디버깅에 주로 사용됨.
'컴퓨터과학 > 임베디드' 카테고리의 다른 글
ARM을 활용한 임베디드 시스템 설계 14 - 소스 컴파일 (0) | 2020.05.04 |
---|---|
ARM을 활용한 임베디드 시스템 설계 13 - shell 프로그래밍 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 6 - 레지스터 (0) | 2020.05.04 |
ARM을 활용한 임베디드 시스템 설계 5 - 메모리 (0) | 2020.05.03 |
ARM을 활용한 임베디드 시스템 설계 4 - ARM 프로세서 구조 (0) | 2020.05.03 |