강좌 & 팁
안녕하세요.
오늘도 ARM 명령어 하나를 공부해 보겟습니다
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. 프로그램 실행화면
다음은 프로그램 실행 화면 입니다.
여러분들도 실행해 보세요~^^
앞으로?
다음글에도 역시! ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다.
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~