안녕하세요~


오늘도 ARM 명령어에 대하여 공부해 보겠습니다.

BL 명령어


저번주엔 B 명령어를 배웠었죠?


오늘은 B 명령어에 L이 추가된 'BL' 명령어에 대하여 공부해 보겠습니다. 


"BL 명령어는 서브루틴 호출 분기 명령어"라고 불립니다.


링크 값을 갖는 분기인 BL 명령어는 B 명령어와 유사하지만 링크 레지스터 LR 에 복귀 주소를 저장해 둡니다 ^^


BL 명령어를 사용하여 프로그램을 해보겠습니다.

1. 프로그램


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



#include <stdio.h>

int  asm_bl_ex ( void );

void bl_test ( void )
{
printf("bl test called\n\n");
}

asm(" \n\
.global asm_bl_ex \n\
asm_bl_ex: \n\
mov ip, sp \n\
stmfd sp!, {fp, ip, lr, pc} \n\
sub fp, ip, #4 \n\
bl  subrotine; \n\
ldmfd sp, {fp, sp, pc} \n\
");

asm(" \n\
.global subrotine \n\
subrotine: \n\
b bl_test \n\
mov pc, lr \n\
");
int main ( void )
{
int b;

printf("\n+-------------------+\n");
printf("|ARM Instruction B |\n");
printf("+-------------------+\n\n");

asm_b_ex();

printf("Program END\n\n");

return 0; }

오늘은 소스가 조금 길어졌습니다 ^^

2. 프로그램 설명


핵심 소스는 당연 


bl subrotine 


이 되겠습니다 ^^


subroine아래 소스는 저번 시간에 b 예제 프로그램을 사용하여 분기가 잘 일어나는지 확인 했습니다.


asm_ex_bl() 함수가 호출되면 


mov ip, sp \n\

stmfd sp!, {fp, ip, lr, pc} \n\

sub fp, ip, #4 \n\

bl subrotine; \n\

ldmfd sp, {fp, sp, pc} \n\


와 같은 일련의 코드가 수행되는데요.


C 언어에서 함수 선언을 어셈블로 표현한것입니다. 


위 부분에서 BL 명령어 다음으로 궁금해 하실 부분은 stmfd와 ldmfd일 것이라 생각이 드는데요!


간단하게 설명하고 넘어 가겠습니다 ^^


stmfd는 스택(stack)공간에 fp, ip, lp, pc 레지스터 값을 저장하는 명령어입니다.


ldmfd는 저장해 놨던 fp, sp, pc 값을 다시 로드하는 명령어 입니다.


stmfd와 ldmfd 명령어도 ARM 명령어 중 한가지 입니다. 


다음 기회에 더욱 정확하게 알아 보도록 하겠습니다 ^^


자, 결과는 어떻게 될까요?


실행해 보겠습니다 ^^

3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_ex_bl.PNG


컴파일해서 실행해 보세요 ^^

앞으로?

 

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


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