"If-Then"의 두 판 사이의 차이
(같은 사용자에 의한 6개의 중간 편집이 숨겨짐) | |||
5번째 줄: | 5번째 줄: | ||
<p>x, y, z에는 T(Then) 혹은 E(Else)중 하나가 올 수 있으며, 있을 수도 있고 없을 수도 있습니다.</p> | <p>x, y, z에는 T(Then) 혹은 E(Else)중 하나가 올 수 있으며, 있을 수도 있고 없을 수도 있습니다.</p> | ||
<p> </p> | <p> </p> | ||
− | <p>예를 들어 아래와 같은 여러가지 조합이 | + | <p>예를 들어 아래와 같은 여러가지 조합이 생실 수 있다는 말입니다</p> |
<p>IT : If-Then</p> | <p>IT : If-Then</p> | ||
<p>ITT : If-Then-Then</p> | <p>ITT : If-Then-Then</p> | ||
14번째 줄: | 14번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>cond 에는 여러가지 조건 비교문이 올 수 있는데, 아래의 표를 참조하시기 바랍니다.</p> | <p>cond 에는 여러가지 조건 비교문이 올 수 있는데, 아래의 표를 참조하시기 바랍니다.</p> | ||
+ | <p>(STMicro의 PM0056 Cortex-M3 programming manual 에서 발췌)</p> | ||
<p><img src="/data/wiki/2015-05-08/1431070742.jpg" alt="" /></p> | <p><img src="/data/wiki/2015-05-08/1431070742.jpg" alt="" /></p> | ||
<p> </p> | <p> </p> | ||
− | <p>그럼 몇가지 샘플을 통해서 | + | <p>그럼 몇가지 샘플을 통해서 If-Then 명령에 대해 본격적으로 알아보겠습니다.</p> |
<p> </p> | <p> </p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p><span style="font-size: large;"><strong><span style="color: #3366ff;">IT : If-Then 예제</span></strong></span></p> | ||
+ | <p>가장 기본적인 "If-Then" 으로 이루어진 예 입니다.</p> | ||
+ | <p>이것을 제대로 이해하려면, "IT EQ" 명령 하나만 떼어 보지 말고,</p> | ||
+ | <p>아래의</p> | ||
+ | <p style="padding-left: 30px;">CMP R2,#0x6F</p> | ||
+ | <p style="padding-left: 30px;">IT EQ</p> | ||
+ | <p style="padding-left: 30px;">MOVS R7,#0x8</p> | ||
+ | <p>명령들을 한번에 묶어서 살펴보아야 이해가 됩니다.</p> | ||
+ | <p>자세한 것은 아래를 보시기 바랍니다.</p> | ||
+ | <p> </p> | ||
+ | <p>장면 1 :</p> | ||
+ | <p>"IT EQ" 명령어 수행 전에, "CMP R2,#0x6F" 명령을 먼저 수행하게 됩니다.</p> | ||
+ | <p>레지스터 창을 보면, 당시의 R2의 값은 0x64인 관계로,</p> | ||
+ | <p>"CMP R2,#0x6F"는 <span style="color: #ff9900;">EQ(EQual)</span>가 성립되지 않아, "Z(Zero)" 플래그가 "0" 값을 가지게 됩니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431158967.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 2 :</p> | ||
+ | <p>결과적으로,</p> | ||
+ | <p>"CMP R2,#0x6F", "IT EQ", "MOVS R7,#0x8" 이 3개의 명령은,</p> | ||
+ | <p>"R2==0x6F이면, R7에 0x8값을 넣고,</p> | ||
+ | <p> R2!=0x6F이면, R7값을 그대로 두어라" 라는 의미를 갖게 됩니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431158498.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 3 :</p> | ||
+ | <p>위에서 말한바와 같이 "IT EQ"에 해당하는 조건이 성립하지 않았으므로,</p> | ||
+ | <p>"MOVS R7,#0x8" 명령이 수행되지 않아 R7값은 변동없이 원래의 값을 가지게 됩니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431158502.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p><span style="font-size: large;"><strong><span style="color: #3366ff;">ITT : If-Then-Then 예제</span></strong></span></p> | ||
+ | <p>조금 복잡해진 If-Then-Then 예제입니다.</p> | ||
+ | <p>위와 마찬가지로 아래의 명령을 묶어서 살펴보겠습니다.</p> | ||
+ | <p style="padding-left: 30px;">CMP R0,#0x0</p> | ||
+ | <p style="padding-left: 30px;">ITT PL</p> | ||
+ | <p style="padding-left: 30px;">LDR R0,[R13]</p> | ||
+ | <p style="padding-left: 30px;">SUBS R0,R0,R4</p> | ||
+ | <p> </p> | ||
+ | <p>장면 1 :</p> | ||
+ | <p>"ITT PL" 명령은,</p> | ||
+ | <p>바로 위에서 수행한 "CMP R0,#0x0" 명령의 결과에 영향을 받습니다.</p> | ||
+ | <p>당시의 R0의 값은 0x52로, "0x52>0x0" 이므로, "ITT <span style="color: #ff9900;">PL(Plus)</span>"에 이어서 나오는 두 개의 명령이 수행되게 됩니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431159813.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 2 :</p> | ||
+ | <p>"ITT PL"의 결과, "LDR R0,[R13]" 명령이 수행될 것입니다.</p> | ||
+ | <p>R13(스택포인터)가 가리키는 주소의 4바이트 값인 0x2000_1AC6이 R0로 복사될 것입니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431159819.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 3 :</p> | ||
+ | <p>"LDR R0,[R13]" 명령이 수행되어, R0값이 0x2000_1AC6으로 변경되었습니다.</p> | ||
+ | <p>이어서 "SUBS R0,R0,R4" 명령에 의해, R0의 값이 R0-R4로 변경될 것입니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431159825.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 4 :</p> | ||
+ | <p>"SUBS R0,R0,R4" 명령이 수행되어 R0값이 0x52로 변경되었습니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-09/1431159831.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p><span style="color: #3366ff; font-size: large;"><strong>ITE : If-Then-Else 예제</strong></span></p> | ||
+ | <p>위의 ITT(If-Then-Then)과 조금 다른 ITE(If-Then-Else) 예제입니다.</p> | ||
+ | <p>전과 마찬가지로 아래의 명령들을 한 번에 묶어서 살펴보겠습니다.</p> | ||
+ | <p style="padding-left: 30px;">CMP R0,#0x78</p> | ||
+ | <p style="padding-left: 30px;">ITE NE</p> | ||
+ | <p style="padding-left: 30px;">MOVS R7,#0xA</p> | ||
+ | <p style="padding-left: 30px;">MOVS R7,#0x10</p> | ||
+ | <p> </p> | ||
+ | <p>장면 1 :</p> | ||
+ | <p>"CMP R0,#0x78" 이 수행된 결과,</p> | ||
+ | <p>R0의 값!=0x78 이므로, Z(Zero) 플래그가 세팅되지 않았습니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-11/1431299891.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 2 :</p> | ||
+ | <p>"CMP R0,#0x78"의 결과가 "Not-Equal"이므로,</p> | ||
+ | <p>"ITE <span style="color: #ff9900;">NE</span>"명령의 "Then"은 실행되고 "Else" 는 실해되지 않게 됩니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-11/1431299896.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 3 :</p> | ||
+ | <p>"ITE"의 첫 번째 "Then" 의 결과로 인해,</p> | ||
+ | <p>"MOVS R7,#0xA" 가 수행되어, R7의 값이 0xA로 변경되었습니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-11/1431299900.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p>장면 4 :</p> | ||
+ | <p>"ITE"의 두 번째 "Else" 의 결과로 인해,</p> | ||
+ | <p>"MOVS R7,#0x10" 은 수행되지 않으므로, R7의 값은 변경되지 않았습니다.</p> | ||
+ | <p><img src="/data/wiki/2015-05-11/1431299905.jpg" alt="" /></p> | ||
+ | <p> </p> | ||
+ | <p> </p> | ||
+ | <p>이상으로 If-Then 명령의 동작 대해 몇 가지 샘플을 통해 알아보았습니다.</p> | ||
+ | <p>If-Then 명령은 수 많은 변종이 생길 수 있으므로, 나머지는 위의 예를 기반으로 동작을 따져보시기 바랍니다.</p> | ||
+ | <p>잘못된 부분이나 기타 문의사항은 TRACE32@hancommdstec.com 으로 연락 부탁드립니다.</p> | ||
+ | <p> </p> | ||
+ | <p>"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</p> |
2020년 7월 24일 (금) 12:50 기준 최신판
이번엔, Cortex-M에서 사용하는 Thumb-II의 특이한 어셈블리 중 하나인 If-Then 에 대해서 살펴보겠습니다.
먼저 If-Then 명령의 문법은
"IT{x{y{z}}} cond" 와 같습니다.
x, y, z에는 T(Then) 혹은 E(Else)중 하나가 올 수 있으며, 있을 수도 있고 없을 수도 있습니다.
예를 들어 아래와 같은 여러가지 조합이 생실 수 있다는 말입니다
IT : If-Then
ITT : If-Then-Then
ITE : If-Then-Else
ITTT : If-Then-Then-Then
ITTE : If-Then-Then-Else
ITTTT : If-Then-Then-Then-Then
cond 에는 여러가지 조건 비교문이 올 수 있는데, 아래의 표를 참조하시기 바랍니다.
(STMicro의 PM0056 Cortex-M3 programming manual 에서 발췌)
그럼 몇가지 샘플을 통해서 If-Then 명령에 대해 본격적으로 알아보겠습니다.
IT : If-Then 예제
가장 기본적인 "If-Then" 으로 이루어진 예 입니다.
이것을 제대로 이해하려면, "IT EQ" 명령 하나만 떼어 보지 말고,
아래의
CMP R2,#0x6F
IT EQ
MOVS R7,#0x8
명령들을 한번에 묶어서 살펴보아야 이해가 됩니다.
자세한 것은 아래를 보시기 바랍니다.
장면 1 :
"IT EQ" 명령어 수행 전에, "CMP R2,#0x6F" 명령을 먼저 수행하게 됩니다.
레지스터 창을 보면, 당시의 R2의 값은 0x64인 관계로,
"CMP R2,#0x6F"는 EQ(EQual)가 성립되지 않아, "Z(Zero)" 플래그가 "0" 값을 가지게 됩니다.
장면 2 :
결과적으로,
"CMP R2,#0x6F", "IT EQ", "MOVS R7,#0x8" 이 3개의 명령은,
"R2==0x6F이면, R7에 0x8값을 넣고,
R2!=0x6F이면, R7값을 그대로 두어라" 라는 의미를 갖게 됩니다.
장면 3 :
위에서 말한바와 같이 "IT EQ"에 해당하는 조건이 성립하지 않았으므로,
"MOVS R7,#0x8" 명령이 수행되지 않아 R7값은 변동없이 원래의 값을 가지게 됩니다.
ITT : If-Then-Then 예제
조금 복잡해진 If-Then-Then 예제입니다.
위와 마찬가지로 아래의 명령을 묶어서 살펴보겠습니다.
CMP R0,#0x0
ITT PL
LDR R0,[R13]
SUBS R0,R0,R4
장면 1 :
"ITT PL" 명령은,
바로 위에서 수행한 "CMP R0,#0x0" 명령의 결과에 영향을 받습니다.
당시의 R0의 값은 0x52로, "0x52>0x0" 이므로, "ITT PL(Plus)"에 이어서 나오는 두 개의 명령이 수행되게 됩니다.
장면 2 :
"ITT PL"의 결과, "LDR R0,[R13]" 명령이 수행될 것입니다.
R13(스택포인터)가 가리키는 주소의 4바이트 값인 0x2000_1AC6이 R0로 복사될 것입니다.
장면 3 :
"LDR R0,[R13]" 명령이 수행되어, R0값이 0x2000_1AC6으로 변경되었습니다.
이어서 "SUBS R0,R0,R4" 명령에 의해, R0의 값이 R0-R4로 변경될 것입니다.
장면 4 :
"SUBS R0,R0,R4" 명령이 수행되어 R0값이 0x52로 변경되었습니다.
ITE : If-Then-Else 예제
위의 ITT(If-Then-Then)과 조금 다른 ITE(If-Then-Else) 예제입니다.
전과 마찬가지로 아래의 명령들을 한 번에 묶어서 살펴보겠습니다.
CMP R0,#0x78
ITE NE
MOVS R7,#0xA
MOVS R7,#0x10
장면 1 :
"CMP R0,#0x78" 이 수행된 결과,
R0의 값!=0x78 이므로, Z(Zero) 플래그가 세팅되지 않았습니다.
장면 2 :
"CMP R0,#0x78"의 결과가 "Not-Equal"이므로,
"ITE NE"명령의 "Then"은 실행되고 "Else" 는 실해되지 않게 됩니다.
장면 3 :
"ITE"의 첫 번째 "Then" 의 결과로 인해,
"MOVS R7,#0xA" 가 수행되어, R7의 값이 0xA로 변경되었습니다.
장면 4 :
"ITE"의 두 번째 "Else" 의 결과로 인해,
"MOVS R7,#0x10" 은 수행되지 않으므로, R7의 값은 변경되지 않았습니다.
이상으로 If-Then 명령의 동작 대해 몇 가지 샘플을 통해 알아보았습니다.
If-Then 명령은 수 많은 변종이 생길 수 있으므로, 나머지는 위의 예를 기반으로 동작을 따져보시기 바랍니다.
잘못된 부분이나 기타 문의사항은 TRACE32@hancommdstec.com 으로 연락 부탁드립니다.
"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기