강좌 & 팁
안녕하세요~
오늘도 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. 프로그램 실행화면
다음은 실행 화면입니다.
컴파일해서 실행해 보세요 ^^
앞으로?
다음글에도 역시~ ARM 명령어 중 하나를 선택하여 공부해 보겠습니다.
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~