일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 손민한
- arm
- 야구
- 리뷰
- 단통법
- NC다이노스
- 프로야구
- Linux
- NC 다이노스
- 안드로이드
- 국정원
- 데이터베이스
- 문파문파
- 타이젠
- ubuntu 12.04
- 뉴스타파
- 블로그
- ubuntu
- 문파문파 공략
- 정보시스템감리사
- 태그를 입력해 주세요.
- 해외직구
- 김경문
- mysql
- 우분투
- Tizen
- 애플
- 디자인 패턴
- 조세피난처
- 인공지능
- Today
- Total
꿈꾸는 사람.
[ARM] LDM, STM 명령어 사용법 본문
이번 글은 ARM 어셈블리어 중 load, store에 대한 기본 명령을 알아 보는 것이다.
Load & Store multiple register instructions
1.1 개요
ARM & Thumb 명령어 셋은 메모리에서 다중 레지스터로 적재 또는 다중 레지스터에서 메모리로 저장하는 명령을 포함한다.
다중 레지스터 전송 명령어들은 여러 레지스터들의 내용을 메모리로/부터 이동하는 효과적인 방법을 제공한다.
블럭 복사와 서브루틴의 진입과 복귀에서 컨택스트 변경을 위한 스택 오퍼레이션에 사용 된다.
일련의 단일 데이터 전송 명령에 대신 다중 레지스터 전달 명령은 아래와 같은 장점이 있다.
- 코드 크기가 작다.
- 하나의 명령어를 페치하면 된다.
- 하나의 레지스터만이 writeback 사이클에 필요하다. 단일 레지스터의 경우는 한 명령에 하나의 레지스터가 필요하다.
1.2 ARM LDM과 STM 명령어
load (store) 다중 명령어는 하나의 명령을 사용하여 메모리에서 (로) 16개 범용 레지스터들의 일부에 적재 (저장)한다.
LDM 명령의 구문:
LDM{cond}address-mode Rn{1}, reg-list{^} |
cond : 선택적 조건 코드. ALU status flags, execution conditions
address-mode: 아래 1.3 LDM과 STM 어드레싱 모드 참조
Rn: 적재 작업의 기본 레지스터이다. 이 레지스터에 저장된 주소는 적재 작업에 대한 시작 주소이다.
r15 (pc)를 이 레지스터로 사용하면 안된다.
!: 베이스 레지스터를 쓰기 저장할 것을 명시한다. 이것이 쓰이면 베이스 레지스터의 주소는 전달된 이후 갱신된다.
레지스터 목록의 각 레지스터에 대해 한 워드씩 감소 또는 증가하게 된다.
reg-list: 심볼 레지스터들의 이름과 중괄호{}로 싸인 레지스터 범위의 목록이며 콤마로 구분된다.
레지스터의 범위는 대쉬로 지정된다.
예) {r0, r1, r4-r6}
베이스 레지스터인 Rn인 reg-list에 있으면, writeback(쓰기 저장)으로 지정하면 안된다.
^: User/System 모드에서는 사용하면 안된다.
privileged mode에서 사용된다.
1.3 LDM과 STM 어드레싱 모드
4개의 어드레싱 방식이 있다.
베이스 레지스터는 오퍼레이션 내의 각 레지스터에 대해 한 워드씩 증가하거나 감소할 수 있다.
각 옵션은 아래와 같다.
IA - 오퍼레이션 이후에 베이스 레지스터 값을 한 워드 증가
IB - 오퍼레이션 전에 베이스 레지스터 값을 한 워드 증가
DA - 오퍼레이션 이후에 베이스 레지스터 값을 한 워드 감소
DB - 오퍼레이션 전에 베이스 레지스터 값을 한 워드 감소
1.4 LDM & STM으로 스택 오퍼레이션
스택 오퍼레이션을 위해 베이스 레지스터는 보통 스택 포인터가 된다.
스택은 높은 주소에서 시작해 낮은 주소로 증가한다. (descending stack) 이 반대의 동작을 ascending stack 이라 한다.
실제적으로 스택은 보통 가득차 있고 descending이다.
스택을 위한 명령어는 다음과 같다.
Stack type | Push | Pop |
Full descending | STMFD (DB) | LDMFD (IA) |
Full ascending | STMFA (IB) | LDMFA (DA) |
Empty descending | STMED (DA) | LDMED (IB) |
Empty ascending | STMEA (IA) | LDMEA (DB) |
예) STMFD r13!, {r0-r5} ;Push onto a Full Descending Stack. LDMFD r13!, {r0-r5} ;Pop from a Full Descending Stack. STMFA r13!, {r0-r5} ;Push onto a Full Ascending Stack. LDMFA r13!, {r0-r5} ;Pop from a Full Ascending Stack. STMED r13!, {r0-r5} ;Push onto Empty Descending Stack. LDMED r13!, {r0-r5} ;Pop from Empty Descending Stack. STMEA r13!, {r0-r5} ;Push onto Empty Ascending Stack. LDMEA r13!, {r0-r5} ;Pop from Empty Ascending Stack. |
1.5 LDM & STM으로 블럭 메모리 복사
예) STMFD sp!, {r4-r11} ; 작업 레지스터를 스택에 저장. LDMIA r0!, {r4-r11} ; 소스의 8 워드의 내용을 r4~r11 레지스터에 적재 STMIA r1!, {r4-r11} ; r4~r11 레지스터에 적재된 값들을 목적지에 저장. |
1.6 Thumb LDM and STM instructions
The Thumb instruction set contains two pairs of multiple register transfer instructions:
다중 레지스터 전송 명령어는 아래와 같이 두 쌍이 있다.
- 블럭 메모리 전송을 위한 LDM & STM
예) LDMIA r1!, {r0, r2-r7} STMIA r4!, {r0-r3} |
- 스택 오퍼레이션을 위한 PUSH & POP
예) PUSH { r0-r3} POP {r0-r3} PUSH { r4-r7, lr} PPOP {r4-r7, pc} |
'IT > HW' 카테고리의 다른 글
[ARM assembler] MRC, MCR 명령어 (0) | 2014.01.10 |
---|