안녕하세요.


오늘은 아침부터 비가 내립니다.


이 비가 그치면 추워지겠죠?


전 겨울은 여름보다 좋습니다 빵긋.gif


자, 오늘은 이전글에서 공부해 보기로 했던 것에 대하여 공부해 보겠습니다.

adc 명령어


ADC 명령어는 두 32비트 값과 캐리의 덧셈기능을 하는 명령어 라고 설명 했었습니다 


그쵸?


해답은 이 글 속에 있습니다.


"캐리의 덧셈기능"


위 말에 말이죠!!


예상한 분들도 계시겠죠!?


맞습니다.


계산한 결과에 CPSR의 캐리 비트가 세팅이 되어있을경우 결과 값에 그 값을 더해 값이 나왔던 것이였습니다.


그럼 정말인지 프로그램해서 검증해 봐야겠죠?

1. 프로그램


다음 프로그램은 CPSR값을 조정하여 캐리 비트를 클리어한 후 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\
mrs r2, cpsr \n\
and r2, #0xCFFFFFFF \n\
msr cpsr, r2 \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. 프로그램 설명


핵심 코드는 다음과 같습니다.


mrs r2, cpsr

and r2, #0xCFFFFFFF

msr cpsr, r2


위의 코드는 CPSR의 캐리 비트를 0으로 클리어 해주는 코드입니다.


코드 하나씩 살펴 보겠습니다.


mrs r2, cpsr


cpsr 레지스터의 내용을 r2로 읽어 옵니다.


and r2, #0xCFFFFFFF


CPSR의 캐리 비트의 위치는 29번째 입니다.

29번째 비트를 클리어 해주기 위해서 r2레지스터 값에 0xCFFFFFFF를 AND 연산해줍니다.

AND 연산이 기억이 안나신다고용? 클릭클릭--->(ARM 명령어를 배워보자!(7) - and)


msr cpsr, r2


r2레지스터의 값을 cpsr 레지스터로 복사합니다.


위 인련의 과정을 거치면 캐리비트는 0으로 클리어 됩니다 빵긋.gif


결과가 0x00000002가 나올까요?


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

3. 프로그램 실행화면


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


asm_adc2_ex.png


adc 명령어는 캐리 플래그를 더해주는 연산도 같이 해주는 명령어란 것을 검증했습니다 ^^


여러분도 같은 결과가 나오나요?

앞으로?

 

다음글에서는 CPSR에 대하여 알아보겠습니다~


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