CBZ and CBNZ

TRACE32
Admin (토론 | 기여) 사용자의 2015년 5월 8일 (금) 16:14 판

이동: 둘러보기, 검색

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 명령으로 비교한 레지스터 값이 0x0이 아닌 경우

아래의 "CBZ R1, 0x08000E56" 의 명령을 수행하는 시점에서, R1의 값은 0xA입니다.

결과적으로 R1!=0x0 이므로 분기 명령이 수행되지 않고, 다음 번지인 0x0800_0E50 으로 진행하게 됩니다.

 

실행 전 :

 

실행 후 :

 

 

CBZ 명령으로 비교한 레지스터 값이 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 명령으로 비교한 레지스터 값이 0x0이 아닌 경우

아래의 "CBNZ R0, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x42입니다.

결과적으로 R0!=0x0 이므로 분기 명령이 수행되어 0x0800_0124 번지로 분기하게 됩니다.

 

실행 전 :

 

실행 후 :

 

 

CBNZ 명령으로 비교한 레지스터 값이 0x0인 경우

아래의 "CBNZ R0, 0x08000124" 의 명령을 수행하는 시점에서, R0의 값은 0x0입니다.

결과적으로 R0의 값은 0x0 이므로 분기분이 수행되지 않고 다음번지인 0x0800_0120 번지로 넘어가게 됩니다.

 

실행 전 :

 

실행 후 :

 

이상으로, Thumb-II에서 사용되는 CBZ, CBNZ 명령에 대해 살펴보았습니다.

잘못된 사항이나, 추가로 궁금하신 사항은 TRACE32@mdstec.com 으로 연락 부탁드립니다.

 

 

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