강좌 & 팁
안녕하세요~
비가 오니깐 정말 시원하고 좋습니다
좋은 기분으로 ARM 명령어를 하나 알아 볼까요~?
다중-레지스터 전송 명령어
다중-레지스터 전송 명령은?
하나의 명령어로 메모리와 프로세서 사이에서 여러개의 레지스터를 전송할 수 있습니다.
다중-레지스터 전송 명령은?
메모리에서 여러 블록의 데이터를 전송하거나 문맥과 스택을 저장하고 복구하는데
단일-전송 레지스터 전송 보다 효과적입니다.
단일-전송 명령어의 확장 판이라고 볼수 있겠네요 ^^
LDM 명령어
맞습니다!
LDM 명령어는 다중-레지스터 전송 명령어중 하나입니다.
LDM 명령어는 여러 개의 레지스터를 읽어 들이는 기능하는 명령어 입니다.
여러 개의 레지스터는 r0-r15 레지스터를 말하는 것이겠죠?
자, 역시 설명 보다 코드한줄이 익숙한 여러분들을 위해 바로 프로그램을 해보겠습니다!
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. 프로그램 실행화면
다음은 프로그램 실행화면 입니다.
여러분도 실행화면과 같은 값이 나왔나요~?
mem1과 mem3의 값은 어떻게 하면 출력할 수 있을까요?
mem1과 mem3값을 잘 읽어 왔을까요~?
여러분들도 프로그램을 실행 시켜서 검증해 보세요 ^^
앞으로?
다음글에도 역시! ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다.
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~