반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[ARM] LDM, STM 명령어 사용법 본문

IT/HW

[ARM] LDM, STM 명령어 사용법

현무랑 니니 2013. 8. 27. 17:33
반응형


이번 글은 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
      Comments