강좌 & 팁
안녕하세요~
저번글은 정말 재미가 없었죠!?ㅎㅎ
제가 보기에도 그렇더군여 ㅠㅠ
그래서 오늘은!
재미있는 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]와 같은 명령을 이용하여 새로운 값을 저장 할 수 있습니다 ^^
이해가 안가신다구요!?
히히.. 이건 문제입니다!
3. 프로그램 실행화면
다음은 실행 화면입니다.
앞으로?
다음글에도 역시~ ARM 명령어 중 하나를 선택하여 공부해 보겠습니다.
문제의 답도 같이 올리겠습니다 ^^
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~
"str r0, [r1]와 같은 명령을 이용하여 새로운 값을 저장 할 수 있습니다 ^^"라고 제가 말했었죠?
답은 간단합니다!
r0에 새로운 값을 넣어주면 됩니다 ^^
요렇게요!
mov r0, #2
정말 간단하죠?ㅎ