안녕하세요~


오늘은 산술연산에서의 배럴 시프터 사용을 해보겠습니다~

배럴 시프터

 

배럴 시프터가 무엇이냐!?


배럴 시프터는 한 번의 연산으로 데이터 워드 내에 있는 다수의 비트를 이동하거나 회전시킬 수 있는 하드웨어 장치이다.

즉, 32 비트 배럴 시프터의 경우라면, 1 사이클 안에 좌측이나 우측으로 최대 32비트씩 이동시킬 수 있다.


출처 -> http://terms.co.kr/barrelshifter.htm


C 언어에서 비트 이동 연산자(<<, >>)를 설명하는거 같습니다! 맞나요??ㅎㅎ


데이터 명령어는 산술 연산 장치(ALU)에서 치리되는데, ARM 명령어의 독특하고도 강력한 특징은 바로 ALU로 입력되기 전에 배럴 시프터에 의해 2진 단위로 좌우 시프트가 가능하다는 점입니다. 이로부터 많은 데이터 처리 명령어의 강력함과 유연성이 증진되 었습니다.


배럴 시프트와 ALU.png


출처 -> ARM System Devloper's Guid, Andrew N. Sloss Dominic Symes Chris Wright

LSL 명령어

 

ARM 명령어에서도 비트 이동 연산자 기능을 하는 명령이 있습니다.


바로 LSL 명령어!


LSL 명령어는 왼쪽으로 논리 시프트할 수 있는 기능이 있습니다.


오늘은 lsl 명령어와 add 명령어를 이용하여 산술연산 중 배럴 시프터를 사용하는 방법에 대하여 공부해 보겠습니다.

1. 프로그램

 

오늘도 역시 프로그램 먼저 하고 설명을 하겠습니다!


다음은 lsl과 add 명령을 이용한 예제 프로그램 lsl.c 입니다.


#include <stdio.h>

int  asm_sum_ex ( int x, int y );

asm(" \n\
.global asm_lsl_ex \n\
asm_lsl_ex: \n\
add r0,  r1, r1, lsl #1 \n\
mov pc, lr \n\
");

int main ( void )
{
int lsl;
printf("\n+-------------------+\n");
printf("|ARMInstruction LSL|\n");
printf("+-------------------+\n\n");

sum = asm_sum_ex( 0, 5);
printf("lsl = %08X\n\n", lsl );  
printf("lsl = %d\n\n", lsl );
return 0; }


실행 결과를 예상해 보세요~~^^

2. 프로그램 설명


이번 예제 프로그램도 역시  asm_lsl_ex()를 사용하여 인자값을 넘겨 줍니다.


asm_lsl_ex(0,5)


어셈블리 코드에서는 0와 5을 처리해야 겠지요?


어셈블리 코드에서는 r0와 r1를 이용하여 함수의 인자값을 받습니다.


다음과 같은 코드라고 할 수 있습니다.


r0 = 0;

r1 = 5;


이렇게 인자값을 받은 후 add 명령어와 LSL 명령을 이용합니다!

add r0,  r1, r1, LSL #1


약간 복잡해 보이는 소스지만 간단합니다!


위 코드 "add r0,  r1, r1, LSL #1" 중 "r1, LSL #1 " 코드를 실행하면 


r1에 있는 값을 lsl 명령으로 한번 왼쪽 쉬프트 하여 r1에 저장합니다.


다음과 같은 형태의 코드로 표현할 수 있습니다.


r1 = r1 << 1;


위 코드를 실행하면 r1의 값은 10 이 되겠죠?


그 후 add r0, r1, r1을 실행합니다.


다음과 같은 코드로 표현할 수 있습니다.


r0 = 0

r1 = 5

r1 = 10


각각의 레지스터의 값을 더하면 답이 나오겠죠?


더하면..


당연히 '15'입니다!!


프로그램을 실행해 검증해 보겠습니다.

3. 프로그램 실행화면


실행 결과는 다음과 같습니다.


arm_lsl_ex.PNG


원하는 값이 잘 나오나요~?


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


컴파일하고 실행하는데 10분도 안걸립니다 ^^

앞으로?

 

다음글에도 역시~ ARM 명령어 중 하나를 선택하여 공부해 보겠습니다.


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