안녕하세요~ 


오늘도 역시 ARM 명령어를 하나 배워볼까요?


이번에는 저번글에서 약속 했듯이 PSR 명령어인 MSR 명령어를 알아보겠습니다. 빵긋.gif

MSR 명령어


MSR 명령어는 레지스터의 내용을 CPSR이나 SPSR로 복사해 주는 명령어입니다.


레지스터는 범용레지스터를 말하며 상수값 또한 복사할 수 있습니다.


줄줄줄 설명 하는 것보다 코드 한줄이 도움이 되겠죠!?


프로그램을 해보겠습니다. ^^

1. 프로그램


다음 프로그램을 실행하면 CPSR 값을 출력합니다.


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



#include <stdio.h>

int  asm_msr_ex ( void );

asm(" \n\
.global asm_msr_ex \n\
asm_msr_ex: \n\
mov r1, #1 \n\
mrs r0, cpsr \n\
orr r0, r0, r1, lsl #28 \n\
msr cpsr, r0 \n\
mrs r0, cpsr \n\
mov pc, lr      \n\
");

int main ( void )
{
int  cpsr;

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

cpsr = asm_msr_ex();         
printf("cpsr = %08X\n\n", cpsr );
return 0; }


실행 결과를 예상해 보세요~ 생각.gif

2. 프로그램 설명


어셈블리 소스를 하나씩 보겠습니다.


mov r1, #1

r1 레지스터에 1을 복사합니다.


mrs r0, cpsr


r0에 cpsr 값을 읽어옵니다.


orr r0, r0, r1, lsl #28


r0와 1을 28번 왼쪽 쉬프트한 r1을 OR 연산하여 r0에 복사합니다.

다음과 같이 표현할 수 있습니다.


cpsr 값이 0x60000010이라 가정하고,

0x60000010 OR 0x10000000 = 0x70000000


요렇게 계산이 됩니다.


맞나요~?


msr cpsr, r0


r0의 내용을 cpsr에 복사 합니다.


mrs r0, cpsr


r0에 cpsr을 읽어옵니다.

이 코드는 cpsr의 값이 잘 적용 되었나 확인 하는 코드가 되겠습니다 ^^


모순 되는 점이 있나요~?


자! 실행 시켜 보겠습니다!

3. 프로그램 실행화면


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


asm_msr_ex().PNG


여러분도 실행해 보세요!

앞으로?

 

다음글에서도 역시 ARM 명령어중 하나를 선택하여 알아보겠습니다 ^^


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