안녕하세요.


오랜만 입니다 ^^


바쁘다는 핑계로 공부를 2주 안했네요. ㅠ


새로운 마음으로 다시 시작해 보겠습니다 ^^


니모닉 조건으로 공부 하고 있었죠?


오늘도 역시 니모닉 조건중 하나를 선택해서 프로그램 해보겠습니다!

CS / HS (Carry Set / Higher or Same)


CS or HS의 의미는 '크거나 같음'이며 상태 플래그 C 가 1일 경우 입니다.


예상을 해보면! 


Carry 플래그 세트가 되거나, 


연산 결과가 크거나 같을 경우일 때,


수행되게 하는 니모닉 조건 이겠죠!?


가정을 했으니,


정말 그렇게 동작하는지 프로그램을 하나를 작성해 보겠습니다!!

1. 프로그램


다음은 cs 니모닉 조건을 이용한 cs.c 에제 프로그램 입니다.


다음 프로그램은 r0와 r1을 비교하여 연산 결과가 크거나 같으면   bcs_test()를 호출하는 프로그램 입니다.



#include <stdio.h>

int  asm_cs_ex ( void );

void bcs_test ( void )
{
printf("BCS TEST OK \n\n");
}

asm(" \n\
.global asm_cs_ex   \n\
asm_cs_ex:       \n\
mov r0, #3 \n\
mov r1, #2 \n\
cmp r0,  r1 \n\
bcs bcs_test \n\
mov pc, lr \n\
");

int main ( void )
{
printf("\n+-----------------------+\n");
printf("|ARM Instruction CS / HS|");
printf("\n+-----------------------+\n\n");

asm_cs_ex();

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

return 0;
}


결과를 예상해 보세요~

2. 프로그램 설명


핵심 소스는 


mov r0, #3

mov r1, #2

cmp r0, r1

bcs bcs_test


입니다!


하나씩 천천히 살펴 보겠습니다.


mov r0, #3

mov r2, #2


은 다음과 같이 표현할 수 있습니다.


r0 = 3;

r1 = 2;


맞나요?


그 후 


cmp r0, r1 


을 수행하면, 


r0와 r1을 비교 합니다.


만약 r0와 r1이 같으면?


bcs_test()를 호출하겠죠?


만약 r0가 r1보다 크면?


bcs_test()를 호출하겠죠?


만약 r0가 r1보다 작으면?



bcs_test()를 호출하지 못하고 프로그램은 종료 되겠죠?


후후...


예상대로 프로그램이 동작하는지 컴파일 해서 실행 시켜 보겠습니다.


3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_cs_ex.PNG


위 실행화면은 r0가 r1 보다 클 경우의 실행 예입니다.


여러분은 같을 경우와 r0가 작을 경우를 실습해 보시면 되겠죠^^?

앞으로?

 

다음글에도 니모닉 조건을 이용하여 프로그램해 보겠습니다 ^^