안녕하세요.


오늘도 글이 늦었습니다. 


늦은 관계로! 


본론으로 빠르게 들어가겠습니다!

REV 명령어


REV 명령어는 한 워드 또는 하프워드 안에서 바이트 반전을 하는 기능을 하는 명령어 입니다.


한 워드는 32비트 하프워드는 32비트의 반 인 16 비트를 말하는 것이겠죠?


REV 명령어은 빅엔디안 데이터를 리틀 엔디안 데이터로 변경하거나 그 반대로 변경할때 사용합니다 ^^


빅엔디안과 리틀엔디안은 따로 공부해 보세용 


빅엔디안 리틀 엔디안 추천글 <~ 클릭클릭


REV 명령을 이용하여 프로그램을 해보겠습니다.

1. 프로그램


다음 프로그램은 REV를 이용하여 0x12345678이라는 수를 리틀엔디안으로 출력하는 프로그램 입니다. 


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




#include <stdio.h>

int asm_rev_ex( int x );

asm(" \n\
.global asm_rev_ex \n\
asm_rev_ex: \n\
rev r0, r0  \n\
mov  pc, lr \n\
");

int main ( void )
{
   int rev;

  printf("\n+------------------+\n");
  printf("|ARMInstruction REV|\n");
   printf("+-------------------+\n\n");
rev = asm_rev_ex( 0x12345678 ); printf("rev = 0x%08X\n\n", rev ); printf("Program END\n\n"); 
return 0; }


결과를 예상해 보세요~

2. 프로그램 설명


프로그램의 핵심코드는 당연


rev r0, r0


입니다.


r0 안에는 0x12345678 이라는 값이 있습니다.


r0 안의 값을 리틀엔디안 값으로 바꾸면 어떻게 될까요?


생각해 보겠습니다.


r0 값을 빅 엔디안 값이라 가정하고 값을 메모리에 배치 시키겠습니다. 


빅엔디안은 0x12345678의 값에서 왼쪽 부터 오른쪽부터 순서대로 메모리에 자리 잡고 있으며, 


사람이 보기에 부담이 없습니다.

┌──┐

│0x12│

┝──┥

│0x34│

┝──┥

│0x56│

┝──┥

│0x78│

└──┘



리틀엔디안은 0x12345678의 값에서 왼쪽 부터 오른쪽 순서대로 자리 잡고 있으며, 

자세히 보지 않으면 정말 햇갈리게 되어있습니다.

┌──┐

│0x78│

┝──┥

│0x56│

┝──┥

│0x34│

┝──┥

│0x12│

└──┘


그럼 REV 명령을 통과하면 값은 어떻게 될까요!?

당연 예상한 결과인

0x78563412 

가 나와야 겠죠?

프로그램을 컴파일해서 실행해 보겠습니다 

3. 프로그램 실행화면


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


asm_rev_ex.PNG

여러분들도 실행해 보세용 

앞으로?

 

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


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