안녕하세요.


날씨가 엄청 추워졌습니다.


모두 감기 조심하세요~!!


오늘도 역시 ARM 명령어 하나를 공부해 보겠습니다 빵긋.gif

REV16 명령어


저번 글에서 공부한  REV 기억 나시나요~?


"REV 명령어는 한 워드 또는 하프워드 안에서 바이트 반전을 하는 기능을 하는 명령어"라고 공부했죠?


기억이 안나시는분은 클릭킄릭~> ARM 명령어를 배워보자!(30) - rev


저번 글에서는 한 워드 단위로 바이트 반전하는 기능이 였다면,


오늘은 하프워드 안에서의 바이트 반전 명령이라 생각하시면 됩니다 빵긋.gif


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


자, 무슨 말인지 프로그램해서 정확하게 알아 보겠습니다.

1. 프로그램


다음 프로그램은 REV16 명령을 이용하여 0x12345678이라는 수를 하프워드의 리틀엔디안으로 출력하는 프로그램 입니다. 


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




#include <stdio.h>

int asm_rev16_ex( int x );

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

int main ( void )
{
   int rev;

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


결과를 예상해 보세요~

2. 프로그램 설명


핵심 코드는 당연


rev16 r0, r0


가 되겠습니다 빵긋.gif


프로그램 설명이 없어도 감 잡으신 분들이 계시겠죠!?


저번에 공부한 rev 명령어와 딱! 한가지 다릅니다.


무엇일까요~?


맞습니다!!


rev 명령어는 한 워드(32 비트)를 엔디안 연산을 하는 명령이고


rev16 명령어는 하프워드 (16 비트)를 엔디안 연산 하는 명령 입니다 빵긋.gif


예를들어 설명해 보겠습니다.


값 0x12345678를 하프워드로 나누면 어떻게 되나요~?


0x1234

0x5678


위와 같이 나눌수 있죠~?


위 수 를 각각


왼족부터 오른쪽 순서대로 읽어 메모리에 배치하면!


0x1234는 


┌──┐

│0x34│

┝──┥

│0x12│

└──┘


요렇게 될것이고,


0x5678은 


┌──┐

│0x78│

┝──┥

│0x56│

└──┘


요렇게 됩니다!

그 후 변환한 순서대로 합치면

┌──┐

│0x34│

┝──┥

│0x12│

└──┘

┌──┐

│0x78│

┝──┥

│0x56│

└──┘


위와 같이 되겠죠?

그럼 결과 값은!?

0x34567856

으로 예상할 수 있습니다!

정말 맞는지 프로그램을 실행해 보겠습니다 ^^

3. 프로그램 실행화면


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


asm_rev16_ex.PNG

여러분들도 실행해 보세요!!

앞으로?

 

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