안녕하세요.


오늘도 ARM 명령어 하나를 공부해 보겟습니다 룰루.gif

SWAP 명령어


SWAP 명령어는 특별한 로드-스토어 명령어로, 메모리의 내용과 레지스터의 내용을 바꾸는 기능을 합니다.


SWAP 명령어는 단일 수행 명령어 입니다.


단일 수행 명령어란?


이 명령의 처리가 끝날때 까지 다른 명령이 끼어드려 데이터를 읽거나 쓰지 못하게 합니다. 

SWP 명령어


SWAP 명령어는 SWP , SWPB 명령어 2가지로 나뉘어 있습니다.


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


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


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

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\
swp 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 ); 를 호출합니다.


그럼 어셈블리 코드가 실행됩니다.


mem32 전역 변수의 주소를 가져옵니다!


ldr r2, =mem2 


요렇게요.


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


swp r0, r1, [r2]


요렇게요!


결과를 예상하면 


r0  = 0x12345678

mem32  = 0x11112222


이렇겠죠!?



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


tmp = r2;

r2  = r1;

r0  = tmp;


맞나요~?

3. 프로그램 실행화면


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


asm_swp_ex.PNG


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

앞으로?

 

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


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