강좌 & 팁
안녕하세요~
한주동안 잘 지내셨나요?
오늘은 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. 프로그램 실행화면
다음은 실행화면 입니다.
정답은 10!
여러분도 저와 같은 결과가 나왔나요~?
앞으로?
다음글에서는 더욱 좋은 글로 찾아 뵙도록하겠습니다!!