안녕하세요 

오늘은 니모닉 조건을 이용하여 프로그램을 해보겠습니다 ^^

저번 글에서 니모닉 표를 한번 보셨죠!?

기억이 안나시는 분들은 클릭 클릭 --> ARM 명령어를 배워보자!(32) - 조건부 실행(1)

니모닉 조건중 하나를 선택하여 공부해 보겠습니다 ^^

EQ (EQual)



EQ의 의미는 '같음' 이며 상태 플래그는 Z 가 1일 경우 입니다.

위 말만 가지고 감이 팍! 오는 분이 계신가요?

그렇다면 존경합니다 (_ _

EQ가 어떻게 쓰이는지 감을 확실히 잡기 위해 프로그램 하나를 작성해 보겠습니다 ^^

1. 프로그램


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


r0와 r1의 비교를 통하여 같으면 beq_test() 를 호출하고 같지 않을 경우 리턴하는 프로그램입니다.


#include <stdio.h>

int  asm_eq_ex ( void );

void beq_test ( void )
{
printf("BEQ TEST OK \n\n");
}

asm(" \n\
.global asm_eq_ex   \n\
asm_eq_ex:       \n\
mov r0, #3 \n\
mov r1, #3 \n\
cmp r0,  r1 \n\
beq beq_test \n\
mov pc, lr \n\
");

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

asm_eq_ex();

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

return 0;
}



결과를 예상해 보세요~^^

2. 프로그램 설명


핵심 소스는 


mov r0, #3

mov r1, #3

cmp r0, r1

beq beq_test


입니다!


하나하나 살펴 보겠습니다.


mov r0, #3

mov r1, #3


위 코드를 수행하면 다음과 같은 코드로 표현할 수 있습니다.


r0 =3;

r1 = 3;


그렇죠?


cmp r0, r1


위 코드를 수행하면,


r0와 r1을 같은지 비교를 합니다.


만약 r0와 r1이 같다면


beq beq_test


위 코드를 수행하여 beq_test()를 호출합니다!

제 말이 맞나요!?

또 다른 방법이 있겠죠?

위해서 말했던 

"상태 플래그는 Z 가 1일 경우 입니다."

라는 말 기억하시죠!?

CPSR의 Z 플래그를 1로 세팅하면 beq_test()를 호출할 수 있겠죠?

어셈 코드로는 다음과 같이 할 수 있습니다.
mov r1, #0xBF000000
orr r1, #0x00FF0000
orr r1, #0x0000FF00  
orr r1, #0x000000FF  
mrs r0, cpsr   
and r0, r1 
msr cpsr, r0  
beq beq_test 
mov  pc, lr 

흐흐..

복잡해 보이지만 결국 CPSR의 Z 플래그를 1로 세팅하는 과정의 코드입니다!

맞게 작성했는지 여러분이 검증해 주세요 ^^

주절주절~ 말이 많았습니다!!

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

3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_eq_ex.PNG

여러분도 실행 되나요~?

앞으로?

 

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