안녕하세요~


비가 오니깐 정말 시원하고 좋습니다 룰루.gif


좋은 기분으로 ARM 명령어를 하나 알아 볼까요~?

다중-레지스터 전송 명령어 


다중-레지스터 전송 명령은?


하나의 명령어로 메모리와 프로세서 사이에서 여러개의 레지스터를 전송할 수 있습니다.


다중-레지스터 전송 명령은?

메모리에서 여러 블록의 데이터를 전송하거나 문맥과 스택을 저장하고 복구하는데 

단일-전송 레지스터 전송 보다 효과적입니다.


단일-전송 명령어의 확장 판이라고 볼수 있겠네요 ^^

LDM 명령어


맞습니다!


LDM 명령어는 다중-레지스터 전송 명령어중 하나입니다.


LDM 명령어는 여러 개의 레지스터를 읽어 들이는 기능하는 명령어 입니다.


여러 개의 레지스터는 r0-r15 레지스터를 말하는 것이겠죠?


자, 역시 설명 보다 코드한줄이 익숙한 여러분들을 위해 바로 프로그램을 해보겠습니다! 번뜩.gif


1. 프로그램


다음 프로그램은 ldmis를 이용해 구조체의 내용을 읽어와 mem2 의 값을 출력하는 프로그램입니다.


다음은 ldmia를 이용한 ldmia.c 예제 프로그램 입니다.



#include <stdio.h>

int asm_ldmia_ex( void );

typedef struct
{
int mem1;
int mem2;
int mem3;
}mem_set;

static mem_set mem;

asm(" \n\
.global asm_ldmia_ex \n\
asm_ldmia_ex: \n\
ldr r3, = mem \n\
ldmia r3!, {r0-r2} \n\
mov r0, r1 \n\
mov pc, lr      \n\
");

int main ( void )
{
int  mem2;

printf("\n+--------------------+\n");
printf("|ARMInstruction LDMIA|\n");
printf("+--------------------+\n\n");

mem.mem1 = 0x01234;
mem.mem2 = 0x5678;
mem.mem3 = 0x12345678;

mem2 = asm_ldmia_ex();         
printf("mem2 value = %08X\n\n", mem2 );
printf("Program END\n\n"); return 0; }


실행 결과를 예상해 보세요~ 


2. 프로그램 설명


코드를 하나하나 살펴 보겠습니다!


여러개를 읽어 드리기 위해서 구조체 하나를 만들었습니다.


typedef struct

{

int mem1;

int mem2;

int mem3;

}mem_set;


요렇게요!


그 후 구조체를 사용하기 위해 선언을 했죠!


static mem_set mem;


요렇게요!


메인(main)함수에서 구조체 안에 변수인 mem1, mem2, mem3에 각각 값을 넣어 줍니다!


mem.mem1 = 0x01234;

mem.mem2 = 0x5678;

mem.mem3 = 0x12345678;


요렇게요!


이렇게 값을 넣는 이유는?


ldmia명령을 이용해 프로그램을 했을때 값을 잘 읽어 왔는지 테스트 하기 위함이죠!


자, 사전 작업을 해 놓은 후,


asm_ldmia_ex() 


인라인 어셈블리 함수를 호출합니다.


이제부턴 어셈블리 코드 겠죠?


구조체 주소를 얻어 옵니다.


ldr r3, =mem


이제 핵심이죠?


구조체 안에 있는 값들을 r0-r2로 읽어 들입니다.


ldmia r3!, {r0-r2}


r3에 저장되 있던 주소를 보고 읽어 올수 있는 겁니다 ^^


읽어온 값들은 


r0 = 0x1234

r1 = 0x5678

r2 = 0x12345678 


으로 예상 됩니다 ^^


정말인지 값을 출력해 봐야겠죠?


우리가 원하는 mem2 값은 이였죠?


리턴되는 값은 r0 임으로 


mov r0, r1 


요렇게 해줍니다!!


결과가 어떻게 나와야 할까요~?


결과를 예상해 보세요!

3. 프로그램 실행화면


다음은 프로그램 실행화면 입니다.


asm_ldmia.PNG


여러분도 실행화면과 같은 값이 나왔나요~?


mem1과 mem3의 값은 어떻게 하면 출력할 수 있을까요?


mem1과 mem3값을 잘 읽어 왔을까요~?


여러분들도 프로그램을 실행 시켜서 검증해 보세요 ^^

앞으로?

 

다음글에도 역시! ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다.


빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~ bye.gif