안녕하세요!


추석 잘들 보내셨나요~?


저는 엄청 잘먹어서 2kg은 찐거 같습니다 유유.gif


잘 먹었으니..


ARM 명령어를 공부해 보겠습니다. 번뜩.gif



CLZ 명령어


CLZ( Count Leading Zero ) 명령어는 최상위 비트에서 처음으로 1이 나온 비트 사이에 0이 몇개 있는지 세는데 사용되는 명령어 입니다.


CLZ 명령어는 수를 정규화 하는 루틴에서 매우 유용하게 사용됩니다.


정규화는 어떤 대상을 일정한 규칙이나 기준에 따르는 정규적인 상태로 바꾸거나,


비정상적인 대상을 정상적으로 되돌리는 과정을 뜻합니다 빵긋.gif


정규화 출처->위키백과 


심플하면서도 재미있는 기능을 하는 명령어 입니다.


정말 세어주는지 프로그램하여 검증해 보겠습니다!

1. 프로그램


다음 프로그램은 0의 개수를 출력하는 프로그램입니다.


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



#include <stdio.h>

int asm_clz_ex( int x  );

asm(" \n\
.global asm_clz_ex \n\
asm_clz_ex: \n\
clz r0, r0  \n\
mov  pc, lr \n\
");

int main ( void )
{
   int clz;

  printf("\n+------------------+\n");
  printf("|ARMInstruction CLZ|\n");
   printf("+-------------------+\n\n");
clz = asm_clz_ex( 0x01000000 ); printf("clz = %d\n\n", clz ); printf("Program END\n\n"); 
return 0; }



결과를 예상해 보세요~

2. 프로그램 설명


프로그램의 핵심코드는 다음과 같습니다.


clz r0, r0


심플하죠?


하나하나 살펴 보겠습니다.


asm_clz_ex() 를 호출하면


r0 에 0x0100000 값이 복사됩니다.


그후 핵심 코드인 


clz r0, r0


를 통과하면!


r0 에는 0의 개수가 들어 있겠죠?


값을 예상해 볼까요?


제 생각엔 값은  '7'입니다!


어떻게 '7'이란 생각을 했냐하면, 


다음과 같습니다.


0x01000000를 2진수로 변환하면 


0000 0001 0000 0000 0000 0000 0000 0000


이 됩니다!


0000 0001 0000 0000 0000 0000 0000 0000

   ↑

(최상위 비트) (처음으로 나온 1)


CLZ 명령어의 설명중에 '최상위 비트에서 처음으로 1이 나온 비트 사이에 0이 몇개 있는지' 라는 말에 대입하면,


답은 7!! 이라 생각 했습니다!


여러분들도 같은 생각이시겠죠!?


프로그램을 실행해서 예상한 값이 맞는지 확인해 보겠습니다.

3. 프로그램 실행화면


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


asm_clz_ex.PNG


예상한 값이 나왔습니다. 하하.gif


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

앞으로?

 

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


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