"ADD, ADC, SUB, SBC and RSB"의 두 판 사이의 차이
2번째 줄: | 2번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>ADD : Add</p> | <p>ADD : Add</p> | ||
− | <p> | + | <p>레지스터 끼리의 값을 더하거나, 레지스터의 값과 상수값을 더합니다.</p> |
<p> </p> | <p> </p> | ||
<p>실행 전 :</p> | <p>실행 전 :</p> | ||
− | <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> </p> | <p> </p> | ||
<p>실행 후 :</p> | <p>실행 후 :</p> | ||
− | <p> | + | <p>R1값이 R13의 값(0x2000_2430)보다 0x8만큼 큰 0x2000_2438로 변했습니다.</p> |
+ | <p><img src="/data/wiki/2015-05-11/1431354909.jpg" alt="" /></p> | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
19번째 줄: | 22번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>SUB : Subtract</p> | <p>SUB : Subtract</p> | ||
+ | <p>레지스터 끼리의 값을 빼거나, 레지스터의 값에서 상수값을 뺍니다.</p> | ||
<p> </p> | <p> </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> </p> | <p> </p> | ||
+ | <p>실행 후 :</p> | ||
+ | <p>수행 결과, R13의 값이 0x2000_244C에서 0x2000_2430으로 0x1C만큼 감소하였습니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-11/1431355276.jpg" alt="" /></p> | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
29번째 줄: | 40번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>RSB : Reverse subtract</p> | <p>RSB : Reverse subtract</p> | ||
+ | <p>서로 값을 빼는 것은 "SUB(Subtract)"와 동일하나,</p> | ||
+ | <p>SUB 명령이 레지스터의 값에서 상수값을 뺀 것과는 반대(Reverse)로,</p> | ||
+ | <p>RSB 명령은 상수값에서 레지스터의 값을 뺍니다.</p> | ||
+ | <p> </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> </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> </p> | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
+ | <p>The Condition flags</p> | ||
+ | <p>N(Negative) : 연산의 결과가 음수이면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.</p> | ||
+ | <p>Z(Zero) : 연산의 결과가 "0x0"이면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.</p> | ||
+ | <p>C(Carry) : 더한 결과가 2^32보다 크거나 같으면 "1"로 세팅되고, 아니면 "0"으로 클리어 됩니다.</p> | ||
+ | <p>뺀 결과가 음수가 아니면 "1"로 세팅되고, 음수이면 "0"으로 클리어 됩니다.</p> | ||
+ | <p>V(oVerflow) : 더하기, 빼기 혹은 비교의 결과가 2^31 이상이거나, -2^31 보다 작으면 "1"로 세팅됩니다.</p> | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </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" 으로 돌아가기