강좌 & 팁
안녕하세요.
오늘도 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. 프로그램 실행화면
다음은 프로그램 실행 화면 입니다.
여러분도 실행해 보세요 ^^
앞으로?
다음글에도 역시! ARM 명령어중 하나를 선택하여 프로그램해 보겠습니다. ^^