"ADD, ADC, SUB, SBC and RSB"의 두 판 사이의 차이

TRACE32
이동: 둘러보기, 검색
2번째 줄: 2번째 줄:
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>ADD : Add</p>
 
<p>ADD : Add</p>
<p>&nbsp;</p>
+
<p>레지스터 끼리의 값을 더하거나, 레지스터의 값과 상수값을 더합니다.</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>실행 전 :</p>
 
<p>실행 전 :</p>
<p>&nbsp;</p>
+
<p>"ADD R1,SP,#0x8" 명령을 통해</p>
 +
<p>스택포인터(R13)의 값에 0x8을 더해 R1에 입력합니다.</p>
 +
<p><img src="/data/wiki/2015-05-11/1431354901.jpg" alt="" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>실행 후 :</p>
 
<p>실행 후 :</p>
<p>&nbsp;</p>
+
<p>R1값이 R13의 값(0x2000_2430)보다 0x8만큼 큰 0x2000_2438로 변했습니다.</p>
 +
<p><img src="/data/wiki/2015-05-11/1431354909.jpg" alt="" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
19번째 줄: 22번째 줄:
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>SUB : Subtract</p>
 
<p>SUB : Subtract</p>
 +
<p>레지스터 끼리의 값을 빼거나, 레지스터의 값에서 상수값을 뺍니다.</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 +
<p>실행 전 :</p>
 +
<p>"SUB SP,SP,#0x1C" 명령을 통해</p>
 +
<p>스택포인터(R13) 의 값을 0x1C만큼 감소하여, 다시 R13으로 입력합니다.</p>
 +
<p><img src="/data/wiki/2015-05-11/1431355268.jpg" alt="" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 +
<p>실행 후 :</p>
 +
<p>수행 결과, R13의 값이 0x2000_244C에서 0x2000_2430으로 0x1C만큼 감소하였습니다.</p>
 +
<p><img src="/data/wiki/2015-05-11/1431355276.jpg" alt="" /></p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
29번째 줄: 40번째 줄:
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>RSB : Reverse subtract</p>
 
<p>RSB : Reverse subtract</p>
 +
<p>서로 값을 빼는 것은 "SUB(Subtract)"와 동일하나,</p>
 +
<p>SUB 명령이 레지스터의 값에서 상수값을 뺀 것과는 반대(Reverse)로,</p>
 +
<p>RSB 명령은 상수값에서 레지스터의 값을 뺍니다.</p>
 +
<p>&nbsp;</p>
 +
<p>실행 전 :</p>
 +
<p>"RSBS R1,R1,#0x700" 명령을 통해,</p>
 +
<p>0x700에서 R1을 뺀 후, 그 값을 R1으로 입력합니다.</p>
 +
<p><img src="/data/wiki/2015-05-11/1431355476.jpg" alt="" /></p>
 +
<p>&nbsp;</p>
 +
<p>실행 후 :</p>
 +
<p>"RSBS R1,R1,#0x700" 수행결과,</p>
 +
<p>R1의 값이 0x600에서 0x100으로 변경되었습니다. (R1 = 0x700-0x600)</p>
 +
<p><img src="/data/wiki/2015-05-11/1431355483.jpg" alt="" /></p>
 +
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 +
<p>The Condition flags</p>
 +
<p>N(Negative) : 연산의 결과가 음수이면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.</p>
 +
<p>Z(Zero) : 연산의 결과가 "0x0"이면 "1"로 세팅되고,&nbsp;아니면 "0"으로 클리어 됩니다.</p>
 +
<p>C(Carry) : 더한 결과가 2^32보다 크거나 같으면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.</p>
 +
<p>뺀 결과가 음수가 아니면 "1"로 세팅되고, 음수이면 "0"으로 클리어 됩니다.</p>
 +
<p>V(oVerflow) : 더하기, 빼기 혹은 비교의 결과가 2^31 이상이거나, -2^31 보다 작으면 "1"로 세팅됩니다.</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>
 
<p>&nbsp;</p>

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" 으로 돌아가기