안녕하세요.


시험기간이라 정신이 하나도 없는 날이네요 ㅠㅠ


하지만! 오늘도 ARM 명령어 하나를 선택하여 공부해 보겠습니다.

adc 명령어


ADC 명령어는 두 32비트 값과 캐리의 덧셈 기능을 하는 명령어 입니다.


어? 32 비트의 덧셈? 


많이 보셨죠?


맞습니다!


ADD 명령어도 32비트 덧셈을 하는 명령어 입니다.


기억이 안나시는 분을 위해 링크~> (ARM 명령어를 배워보자!(4) - add)


ADC명령어와 ADD명령어의 차이점은 더할때 CPSR레지스터의 C 플래그를 더해준다는 점!


CPSR의 상세한 내용을 나중에 공부하기로하고, 일단, CPSR 레지스터에 C 플래그가 있구나~


라고만 알고 넘어가도록 ㅎ


ADC명령중 C는 C 플래그를 의미하는거 같죠?


ADC 명령어를 사용하여 프로그램하여 정확히 어떻게 동작하는지 알아보겠습니다.

1. 프로그램


다음 프로그램은 ADC 명령어를 이용하여 리턴되는 값을 출력하는 프로그램입니다.


다음은 adc 명령어를 이용한 adc.c 예제 프로그램입니다.




#include <stdio.h>

int asm_adc_ex( int x, int y  );

asm(" \n\
.global asm_adc_ex \n\
asm_adc_ex: \n\
adc r0, r0, r1 \n\
mov  pc, lr \n\
");

int main ( void )
{
   int adc;

  printf("\n+------------------+\n");
  printf("|ARMInstruction ADC|\n");
   printf("+-------------------+\n\n");
adc = asm_adc_ex( 0x00000001, 0x00000001 ); printf("adc = 0x%08X\n\n", adc ); printf("Program END\n\n"); 
return 0; }


결과를 예상해 보세요~

2. 프로그램 설명


프로그램의 핵심코드는 다음과 같습니다.


adc r0, r0, r1

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


r0 = r0 + r1


r0 안에 값은 0x00000002 가 되겠죠?


컴파일 해서 실행해 보겠습니다.

3. 프로그램 실행화면


다음은 프로그램 실행 화면 입니다.


asm_adc_ex.PNG


헉!?


예상한 결과가 나오지 않았습니다 ㅠ


왜 이런 값이 나왔을까요?


모두 한번 생각해 보아요!

앞으로?

 

다음 글에는 위와 같은 값이 나온 이유에 대하여 공부해 보겠습니다 ^^


빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~bye.gif