안녕하세요.


오늘도 역시 니모닉 조건중 하나를 선택해서 공부해 보겠습니다 ^^

MI( MInus )


MI 의 의미는 '음수'이며 상태 플래그 N 가 1일 경우 입니다.


이 니모닉 조건도 역시 간단하죠?


예상을 해보면,


Nagative 플래그가 세트(1)이 되거나,


연산결과가 음수일 경우,


수행하게 하는 니모닉 조건 일것입니다.


어떻게 동작하는지 프로그램 하나를 만들어 보겠습니다.

1. 프로그램


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


다음 프로그램은 r0와 r1을 비교하여 연산 결과가 음수일 경우 bmi_test()를 호출하는 프로그램입니다.




#include <stdio.h>

int  asm_mi_ex ( void );

void bmi_test ( void )
{
printf("BMI TEST OK \n\n");
}

asm(" \n\
.global asm_mi_ex \n\
asm_mi_ex:       \n\
mov r0, #2 \n\
mov r1, #3 \n\
cmp r0,  r1 \n\
bcc bmi_test \n\
mov pc, lr \n\
");

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

asm_mi_ex();

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

return 0;
}


결과를 예상해 보세요~

2. 프로그램 설명


핵심 소스는 


mov r0, #2

mov r1, #3

cmp r0, r1

bcc bmi_test


입니다.


본론으로 들어가기 전에 cmp 명령어에 관해서 잠깐 집고 가겠습니다.


cmp 명령어는 비교 명령이며, 다음과 같은 표기법 중 하나는 다음과 같습니다.


<CMP> Rn, Rm


위 명령은 다음과 같이 수행 됩니다.


Rn - Rm : 상태 플래그 업데이트


눈치 빠르신분은 눈치 채셨을 겁니다!


자, 본론으로 들어가서 코드를 하나씩 천천히 살펴 보겠습니다.


mov r0, #2

mov r1, #3


위 코드는 이제 익숙하시죠?


위 코드는 다음과 같이 표현할 수 있습니다.


  r0 = 2;

r1 = 3;


그 후,


cmp r0, r1을 수행하면!?


이때 Rn은 r0, Rm은 r1에 대입 돼겠죠?


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


Rn - Rm = ?

r0 - r1 = ?

2 - 3 = ?


위 3개는 모두 같은 의미겠죠?


그러므로 결과는!?


음수 '-1' 이 나옵니다!


그렇다면!?


bmi_test()가 호출이 되겠죠?


프로그램을 컴파일 해서 실행 시켜 보겠습니다.

3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_mi_ex.PNG


여러분들도 실행해 보세요~^^

앞으로?

 

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