안녕하세요~


한주동안 잘 지내셨나요?


오늘은 ARM 명령어를 이용하여 C 언어에서 사용하는 for 루프와 같은 역할을 하는 프로그램을 만들어 보겠습니다.

1. 프로그램

 

다음은 for 루프와 같은 역활을 하는 loop.c 예제 프로그램 입니다. 



#include <stdio.h>

int  asm_loop_ex ( int x );                               // 어셈함수의 프로토타입

asm(" \n\
.global asm_loop_ex \n\
mov r1, #1      \n\
cmp r1, #0xA    \n\
add r0, r0, #1  \n\
bcc for_loop    \n\
mov pc, lr      \n\
");

int main ( void )
{
int  loop ;

printf("\n+---------------------+\n");
printf("|ARMInstruction LOOP|\n");
printf("+---------------------+\n\n");

loop = asm_loop_ex(1);         
printf("for = %d\n\n", loop );
return 0; }


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

2. 프로그램 설명


이번 예제 프로그램에서는 asm_loop_ex() 함수에 인자값을 넘겨 줍니다!


한줄 한줄 어셈코드를 분석해 보겠습니다 ^^


mov r1, #1


r1 레지스터에 1을 넣습니다!


위 코드는 for 루프에서 i = 0; 와 같은 역할을 합니다!


for_loop:


라밸을 하나 만듭니다. ( C언어에서 함수 하나를 선언한다고 생각하시면 되겠습니다 ^^)


이 부분으로 조건에 만족 할때까지 분기합니다 ^^


add r1, r1, #1


위 코드는 for 루프에서 i++ 와 같은 역할을 합니다 ^^


cmp r1, #0xA


위 코드는 r1 와 0xA 를 비교 합니다.


add r0, r0, #1 


r0 에 1을 증가 시킵니다. (  r0 += 1와 같은 형태 이겠죠? ) 


bcc for_loop


r1이 A 보다 작으면 for_loop로 분기합니다.


( r1 < 0xA )와 같은 형태로 표한할 수 있습니다.


자, 이제 종합해 보면


r1 = 0; r1 < 0xA; r1 ++


위와 같은 코드가 만들어 질수 있습니다.


C 언어로 표현하면 다음과 같겠죠?


for( r1 = 0; r1 < 0xA; r1++ )


자! 그렇다면 결과는 어떻게 될까요??

3. 프로그램 실행화면


다음은 실행화면 입니다.


asm_loop_ex().PNG


정답은 10!


여러분도 저와 같은 결과가 나왔나요~?

앞으로?

 

다음글에서는 더욱 좋은 글로 찾아 뵙도록하겠습니다!!