강좌 & 팁
안녕하세요.
오늘은 아침부터 비가 내립니다.
이 비가 그치면 추워지겠죠?
전 겨울은 여름보다 좋습니다
자, 오늘은 이전글에서 공부해 보기로 했던 것에 대하여 공부해 보겠습니다.
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으로 클리어 됩니다
결과가 0x00000002가 나올까요?
컴파일 해서 실행해 보겠습니다.
3. 프로그램 실행화면
다음은 프로그램 실행 화면 입니다.
adc 명령어는 캐리 플래그를 더해주는 연산도 같이 해주는 명령어란 것을 검증했습니다 ^^
여러분도 같은 결과가 나오나요?
앞으로?
다음글에서는 CPSR에 대하여 알아보겠습니다~
빠른만남을 원하시면 http://ms-osek.org/ 여기로 찾아오세요~