안녕하세요~


저번글은 정말 재미가 없었죠!?ㅎㅎ


제가 보기에도 그렇더군여 ㅠㅠ


그래서 오늘은!


재미있는 ARM 명령어를 준비 했습니다 ^^


자~ 오늘도 새로운걸 배워 볼까요?

단일-레지스터 전송 명령어


ARM 명령어 중 메모리에서 레지스터를 읽거나 메모리에 레지스터를 저장하는 LDR 명령어와 STR 명령을 지원 합니다. 


이들 명령어는 2개의 프리인덱스(free index) 주소지정방식( 레지스터 오프셋과 상수 오프셋)을 사용합니다.


굉장히 어려운 말입니다 ㅠㅠ


오늘은 이 두 명령어 LDR, STR을 공부해 보겠습니다 ^^

LDR 명령어


LDR 명령어는 메모리에서 워드를 레지스터로 읽어 드리는 명령어 입니다.


쉽게 말해 메모리의 주소를 레지스터로 읽어 온다고 생각할 수 있습니다!


맞나요?ㅎㅎ


여러분들도 생각해 보세요!

STR 명령어


STR 명령어는 레지스터에서 워드를 메모리에 저장하는 명령어 입니다.


메모리에서 읽어 드리는 명령어가 있다면 다시 저장하는 명령어도 필요하겠죠?


STR 명령어가 LDR 명령과 대응되는 명령어 같습니다 ^^


100 줄의 설명보다 한 줄의 코드가 이해가 빠르겠죠?


오늘은 이 두 명령을 이용하여 프로그램 해보겠습니다 ^^

1. 프로그램


이번 프로그램은 ldr 명령어를 이용하여 전연 변수를 액세스 하는 프로그램 입니다 ^^


재미있겠죠!?ㅎㅎ


다음은 LDR 명령어를 이용한 ldr.c 예제 프로그램 입니다.


#include <stdio.h>

int  asm_ldr_ex ( void ); // 어셈 함수의 프로토 타입

int mem32; // 전역 변수 선언

asm(" \n\
.global asm_ldr_ex \n\
asm_ldr_ex: \n\
ldr r1, =mem32 \n\
ldr r0, [r1] \n\
str r0, [r1] \n\
mov pc, lr \n\
");

int main ( void )
{
int ldr;

printf("\n+-------------------+\n");
printf("|ARM Instruction LDR |\n");
printf("+-------------------+\n\n");

mem32 = 3;

ldr = asm_ldr_ex();

printf("mem32 value = %d\n", ldr );

printf("Program END\n\n");

return 0; }

자!


결과를 예상해 보세요!

2. 프로그램 설명


핵심 소스는 당연


ldr r1, =mem32

ldr r0, [r1] 

str r0, [r1] 


위의 3줄 입니다!


자, 한줄씩 해석해 보겠습니다.


ldr r1, =mem32은


mem32 전역변수의 주소를 r1로 읽어 옵니다.


ldr r0, [r1]은 


r1의 주소의 해당하는 값을 r0에 읽어옵니다.


물론 위에 과정만 해도 r0에 3값이 로드 되어 r0를 리턴하면 원하는 값을 읽어 올수 있지만,


전역 변수에 다른 값을 넣고 싶으면! 


str r0, [r1]와 같은 명령을 이용하여 새로운 값을 저장 할 수 있습니다 ^^


이해가 안가신다구요!?


히히.. 이건 문제입니다!


자, 다시 본론으로 돌아와서!

str r0, [r1]을 하게 되면 

r1의 주소의 r0의 값을 저장 합니다.

자 이렇게 하면 어떤 값이 리턴 될까요??

프로그램을 컴파일하여 실행해 보겠습니다 ^^

3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_ldr_ex().PNG

여러분들도 저와 같은 결과가 나오나요~?

앞으로?

 

다음글에도 역시~ ARM 명령어 중 하나를 선택하여 공부해 보겠습니다.


문제의 답도 같이 올리겠습니다 ^^


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