"CBZ and CBNZ"의 두 판 사이의 차이
(같은 사용자에 의한 하나의 중간 편집이 숨겨짐) | |||
9번째 줄: | 9번째 줄: | ||
<p>자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.</p> | <p>자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.</p> | ||
<p> </p> | <p> </p> | ||
− | <p><strong>CBZ 명령으로 비교한 레지스터 값이 0x0이 아닌 경우</strong></p> | + | <p><strong>CBZ(Compare and Branch on Zero) 명령으로 비교한 레지스터 값이 0x0이 아닌 경우</strong></p> |
<p>아래의 "CBZ <span style="color: #ff9900;">R1</span>, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0xA입니다.</p> | <p>아래의 "CBZ <span style="color: #ff9900;">R1</span>, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0xA입니다.</p> | ||
<p>결과적으로 <span style="color: #ff9900;">R1!=0x0</span> 이므로 <span style="color: #ff9900;">분기 명령이 수행되지 않고</span>, 다음 번지인 0x0800_0E50 으로 진행하게 됩니다.</p> | <p>결과적으로 <span style="color: #ff9900;">R1!=0x0</span> 이므로 <span style="color: #ff9900;">분기 명령이 수행되지 않고</span>, 다음 번지인 0x0800_0E50 으로 진행하게 됩니다.</p> | ||
20번째 줄: | 20번째 줄: | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
− | <p><strong><strong>CBZ 명령으로 비교한 레지스터 값이 0x0인 경우</strong></strong></p> | + | <p><strong><strong><strong>CBZ(Compare and Branch on Zero)</strong> 명령으로 비교한 레지스터 값이 0x0인 경우</strong></strong></p> |
<p>아래의 "CBZ <span style="color: #ff9900;">R1</span>, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0x0입니다.</p> | <p>아래의 "CBZ <span style="color: #ff9900;">R1</span>, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0x0입니다.</p> | ||
<p>결과적으로 <span style="color: #ff9900;">R1==0x0</span> 이므로 0x0800_0E56번지로 <span style="color: #ff9900;">분기 명령이 수행</span>됩니다.</p> | <p>결과적으로 <span style="color: #ff9900;">R1==0x0</span> 이므로 0x0800_0E56번지로 <span style="color: #ff9900;">분기 명령이 수행</span>됩니다.</p> | ||
38번째 줄: | 38번째 줄: | ||
<p>자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.</p> | <p>자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.</p> | ||
<p> </p> | <p> </p> | ||
− | <p><strong>CBNZ 명령으로 비교한 레지스터 값이 0x0이 아닌 경우</strong></p> | + | <p><strong>CBNZ(Compare and Branch on Non-zero) 명령으로 비교한 레지스터 값이 0x0이 아닌 경우</strong></p> |
<p>아래의 "CBNZ <span style="color: #ff9900;">R0</span>, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x42입니다.</p> | <p>아래의 "CBNZ <span style="color: #ff9900;">R0</span>, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x42입니다.</p> | ||
<p>결과적으로 <span style="color: #ff9900;">R0!=0x0</span> 이므로 <span><span style="color: #ff9900;">분기 명령이 수행</span>되어 0x0800_0124 번지로 분기하게 됩니다.</span></p> | <p>결과적으로 <span style="color: #ff9900;">R0!=0x0</span> 이므로 <span><span style="color: #ff9900;">분기 명령이 수행</span>되어 0x0800_0124 번지로 분기하게 됩니다.</span></p> | ||
49번째 줄: | 49번째 줄: | ||
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
− | <p><strong>CBNZ 명령으로 비교한 레지스터 값이 0x0인 경우</strong></p> | + | <p><strong><strong>CBNZ(Compare and Branch on Non-zero)</strong> 명령으로 비교한 레지스터 값이 0x0인 경우</strong></p> |
<p>아래의 "CBNZ <span style="color: #ff9900;">R0</span>, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x0입니다.</p> | <p>아래의 "CBNZ <span style="color: #ff9900;">R0</span>, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x0입니다.</p> | ||
<p>결과적으로 <span style="color: #ff9900;">R0의 값은 0x0</span> 이므로 <span style="color: #ff9900;">분기분이 수행되지 않고</span> 다음번지인 0x0800_0120 번지로 넘어가게 됩니다.</p> | <p>결과적으로 <span style="color: #ff9900;">R0의 값은 0x0</span> 이므로 <span style="color: #ff9900;">분기분이 수행되지 않고</span> 다음번지인 0x0800_0120 번지로 넘어가게 됩니다.</p> | ||
60번째 줄: | 60번째 줄: | ||
<p> </p> | <p> </p> | ||
<p>이상으로, Thumb-II에서 사용되는 CBZ, CBNZ 명령에 대해 살펴보았습니다.</p> | <p>이상으로, Thumb-II에서 사용되는 CBZ, CBNZ 명령에 대해 살펴보았습니다.</p> | ||
− | <p>잘못된 사항이나, 추가로 궁금하신 사항은 TRACE32@ | + | <p>잘못된 사항이나, 추가로 궁금하신 사항은 TRACE32@hancommds.com 으로 연락 부탁드립니다.</p> |
<p> </p> | <p> </p> | ||
<p> </p> | <p> </p> | ||
<p>"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</p> | <p>"<strong><a href="/wiki/index.php/Cortex-M">TRACE32로 바라본 ARM - Cortex-M</a></strong>" 으로 돌아가기</p> |
2020년 7월 24일 (금) 12:50 기준 최신판
Thumb-II 명령어에서만 사용되어 익숙하지 않은,
CBZ(Compare and Branch on Zero) 와 CBNZ(Compare and Branch on Non-Zero) 명령에 대해 알아보겠습니다.
CBZ : Compare and Branch on Zero
CBZ 명령은 "CBZ Rn, label" 과 같은 문법 구조를 가집니다.
Rn의 값이 "0x0"이면 label로 분기하고,
Rn의 값이 "0x0"이 아니면, 다음 번지로 진행합니다.
자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.
CBZ(Compare and Branch on Zero) 명령으로 비교한 레지스터 값이 0x0이 아닌 경우
아래의 "CBZ R1, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0xA입니다.
결과적으로 R1!=0x0 이므로 분기 명령이 수행되지 않고, 다음 번지인 0x0800_0E50 으로 진행하게 됩니다.
실행 전 :
실행 후 :
CBZ(Compare and Branch on Zero) 명령으로 비교한 레지스터 값이 0x0인 경우
아래의 "CBZ R1, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0x0입니다.
결과적으로 R1==0x0 이므로 0x0800_0E56번지로 분기 명령이 수행됩니다.
실행 전 :
실행 후 :
CBNZ : Compare and Branch on Non-zero
CBNZ 명령은 "CBNZ Rn, label" 과 같은 문법 구조를 가집니다.
Rn의 값이 "0x0"이 아니면 label로 분기하고,
Rn의 값이 "0x0"이면, 다음 번지로 진행합니다.
자세한 것은 아래의 예를 통해 확인해 보시기 바랍니다.
CBNZ(Compare and Branch on Non-zero) 명령으로 비교한 레지스터 값이 0x0이 아닌 경우
아래의 "CBNZ R0, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x42입니다.
결과적으로 R0!=0x0 이므로 분기 명령이 수행되어 0x0800_0124 번지로 분기하게 됩니다.
실행 전 :
실행 후 :
CBNZ(Compare and Branch on Non-zero) 명령으로 비교한 레지스터 값이 0x0인 경우
아래의 "CBNZ R0, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x0입니다.
결과적으로 R0의 값은 0x0 이므로 분기분이 수행되지 않고 다음번지인 0x0800_0120 번지로 넘어가게 됩니다.
실행 전 :
실행 후 :
이상으로, Thumb-II에서 사용되는 CBZ, CBNZ 명령에 대해 살펴보았습니다.
잘못된 사항이나, 추가로 궁금하신 사항은 TRACE32@hancommds.com 으로 연락 부탁드립니다.
"TRACE32로 바라본 ARM - Cortex-M" 으로 돌아가기