안녕하세요.


오늘도 ARM 명령어를 공부해 보겠습니다. ^^

SWPB 명령어


엇!? 이 명령어???


어디서 많이본 명령어 같죠?


맞습니다!


저번에 한번 공부했던적 있습니다.


SWP 명령어죠! ( 한번더 보실 분들은 클릭 ^^ )


SWP 명령을 공부했을때 SWPB 명령어를 언급하기는 했습니다.


하지만 프로그램은 안만들어 봤죵?


그래서 오늘은 SWPB 명령어를 이용하여 프로그램 해보겠습니다 ^^


후후.. 


설명을 안하고 넘어갈뻔했습니다.


SWP 명령어는 메모리와 레지스터간 '워드'를 교환하며,


SWPB 명령어는 메모리와 레지스터간의 '바이트'를 교환합니다!


SWPB 명령어를 이용하여 프로그램을 작성해 보겠습니다 ^^



1. 프로그램


다음 프로그램은 swp 명령어를 이용하여 전역 변수인 mem32 의 값과 r0 값을 교체 하여 출력하는 프로그램 입니다. 


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



#include <stdio.h>

int asm_swp_ex( int x, int y );

int mem32;

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

int main ( void )
{
int swp;
     printf("\n+------------------+\n");
     printf("|ARMInstruction SWP|\n");
printf("+-------------------+\n\n");
mem32 = 0x12345678;  printf("SWP Before...\n"); printf("r0 value = 0x%08X \n", swp ); printf("mem32 value = 0x%08X \n\n", mem32 ); swp = asm_swp_ex( 0x00000000, 0x11112222 ); printf("SWP After...\n"); printf("r0 value = 0x%08X\n", swp); 
printf("mem32 value = 0x%08X\n", mem32 ); printf("Program END\n\n"); 
return 0; }


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

2. 프로그램 설명


이번 프로그램도 아~주 간단합니다.


main() 부터 보겠습니다!


mem32 전역 변수를 0x12345678 값으로 초기화 했습니다.


그 후,


asm_swp_ex( 0x00000000, 0x11112222 ) 를 호출합니다.


그럼 어셈블리 코드가 실행되겠죠?


ARM 명령어인 LDR을 이용하여 다음과 같이 mem32 전역 변수의 주소를 가져옵니다!


ldr r2, =mem2 


요렇게요.


그 다음 r0로 하나의 바이트를 로드 하여, 메모리를 레지스터 r1로 덮어 씁니다!


swpb r0, r1, [r2]


요렇게요!


결과를 예상하면 


r0  = 0x12345678

mem32  = 0x11112222


이렇겠죠!?



다음과 같은 일련의 작업이 수행 되었을 겁니다.


tmp = r2;

r2  = r1;

r0  = tmp;


맞나요~?


그렇다면 결과가 어떻게 될까요?


정답은 프로그램을 실행

3. 프로그램 실행화면


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


asm_swpb_ex.PNG


여러분도 실행해 보세요 ^^

앞으로?

 

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