안녕하세요.


비가 내리는 기분좋은 오후 입니다 ^^


좋은 기분으로 니모닉 조건을 선택하여 공부해 보겠습니다!

VS( oVerflow )


VS의 의미는 오버플로우이며 Overflow 플래그가 세트(1)일 경우 입니다.


오버플러우가 발생하는 경우는 언제 일까요?


보통 ARM 산술 연산 명령어는 32 비트 정수값에 오버플로우가 발생하는 경우 이를 제대로 처리하지 못합니다.


예를들어 0x7FFFFFFF + 1 = -0x8000000 이 됩니다. 


그러므로 산술 연산을 처리하는 프로그램을 작성 할때 32비트 정수에서 최대로 사용가능한 값을 초가하지 않도록 주의 해야겟지요~??ㅎㅎ


이 이론을 바탕으로 오버플러우가 발생하는 프로그램을 만들어 실행해 보겠습니다 ^^

1. 프로그램


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


다음 프로그램은 정수의 최대값을 초과하였을때 bvs_test() 함수를 호출하는 프로그램입니다.



#include <stdio.h>

int  asm_vs_ex ( void );

void bvs_test ( void )
{
printf("BVS TEST OK \n\n");
}

asm(" \n\
.global asm_vs_ex \n\
asm_vs_ex:       \n\
mov r0, #0 \n\
mov r1, #0x70000000 \n\
mov r2, #0x7FFFFFFF \n\
adds r0, r1, r2 \n\
bvs bvs_test \n\
mov pc, lr \n\
");

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

asm_vs_ex();

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

return 0;
}


결과를 예상해 보세요 ^^

2. 프로그램 설명


코드를 하나하나 보면서 어떤 프로그램인가 알아보겠습니다.


핵심소스는


mov r0, #0

mov r1, #0x70000000

mov r2, #0x7FFFFFFF

adds r0, r1, r2

bvs bvs_test


입니다.


mov r0, #0

mov r0, #0x70000000

mov r0, #0x7FFFFFFF


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

r0 = 0;
r1 = 0x70000000; (양수)
r2 = 0x7FFFFFFF; (양수)

그 후 

adds r0, r1, r2
(add 명령어에 붙은 s(접미사)는 add 명령어 수행후에 CPSR 플래그를 업데이트 시켜주는 기능을 합니다 ^^)

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

r0 = r1 + r2;

그럼 r0엔 무슨 값이 있을까요?

r0 = 0xEFFFFFFF (음수)

0xEFFFFFFF 값이 들어있습니다 ^^

이해가 안가시나요!?

다시한번 살펴 보면 r1와 r2은 양수이며, 

그 중 r2에 저장되있는 값 0x7FFFFFFF는 32비트로 저장할 수 있는 최대의 정수 값입니다. 

r1과 r2를 더하면 더 큰 양수값이 나와야 하는게 정상이죠?

하지만 결과값은 0xEFFFFFFF 인 음수가 되며 오버플로우 플래그인 V 가 1로 세트가 되는 것입니다.

오버플로우 플래그인 V가 1로 세트가 된다면 

bvs bvs_test

가 수행이 되면서

bvs_test()

를 호출할 것입니다 ^^

프로그램을 실행시켜 확인해 보겠습니다 ^^

3. 프로그램 실행화면


다음은 실행 화면입니다.


asm_vs_ex.PNG


여러분들도 실행시켜 보세요 ^^

앞으로?

 

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