ADD, ADC, SUB, SBC and RSB

TRACE32
Admin (토론 | 기여) 사용자의 2015년 5월 11일 (월) 23:53 판

이동: 둘러보기, 검색

이번에는 가장 간단한 레지스터 연산인 ADD, ADC, SUB, SBC, RSB 에 대해 알아보겠습니다.

 

ADD : Add

레지스터 끼리의 값을 더하거나, 레지스터의 값과 상수값을 더합니다.

 

실행 전 :

"ADD R1,SP,#0x8" 명령을 통해

스택포인터(R13)의 값에 0x8을 더해 R1에 입력합니다.

 

실행 후 :

R1값이 R13의 값(0x2000_2430)보다 0x8만큼 큰 0x2000_2438로 변했습니다.

 

 

 

 

ADC : Add with carry

 

 

 

 

SUB : Subtract

레지스터 끼리의 값을 빼거나, 레지스터의 값에서 상수값을 뺍니다.

 

실행 전 :

"SUB SP,SP,#0x1C" 명령을 통해

스택포인터(R13) 의 값을 0x1C만큼 감소하여, 다시 R13으로 입력합니다.

 

실행 후 :

수행 결과, R13의 값이 0x2000_244C에서 0x2000_2430으로 0x1C만큼 감소하였습니다.

 

 

SBC : Subtract with carry

 

 

 

 

RSB : Reverse subtract

서로 값을 빼는 것은 "SUB(Subtract)"와 동일하나,

SUB 명령이 레지스터의 값에서 상수값을 뺀 것과는 반대(Reverse)로,

RSB 명령은 상수값에서 레지스터의 값을 뺍니다.

 

실행 전 :

"RSBS R1,R1,#0x700" 명령을 통해,

0x700에서 R1을 뺀 후, 그 값을 R1으로 입력합니다.

 

실행 후 :

"RSBS R1,R1,#0x700" 수행결과,

R1의 값이 0x600에서 0x100으로 변경되었습니다. (R1 = 0x700-0x600)

 

 

 

The Condition flags

N(Negative) : 연산의 결과가 음수이면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.

Z(Zero) : 연산의 결과가 "0x0"이면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.

C(Carry) : 더한 결과가 2^32보다 크거나 같으면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.

뺀 결과가 음수가 아니면 "1"로 세팅되고, 음수이면 "0"으로 클리어 됩니다.

V(oVerflow) : 더하기, 빼기 혹은 비교의 결과가 2^31 이상이거나, -2^31 보다 작으면 "1"로 세팅됩니다.

 

 

이상으로 기본적인 레지스터 연산인 ADD, SDC, SUB, SBC, RSB에 대해 알아보았습니다.

잘못된 점이나, 추가 문의사항은 TRACE32@mdstec.com 으로 연락 부탁드립니다.

 

"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기