cbnz 명령어는 Compare Branch None-zero의 약자입니다.
명령어의 이름 그대로 레지스터의 값이 0이 아닌 경우, 지정된 주소로 브랜치하는 명령어입니다.
 
아래 코드를 봅시다.
 
01 and     x2,x1,#0x3F      ; x2,x1,#63
02 cbnz    x2,0xFFFFFF8008083728   ; x2,work_pending
 
01번째 줄 코드를 봅시다.
x1이 0x1이면 x2는 0x1, x1이 0x3f이면 x2는 0x3f가 됩니다.
 
이 경우 x2는 0x1 혹은 0x3f이므로 0이 아니니, non-zero가 됩니다.
 
그 다음 02번째 줄을 실행하면 work_pending 레이블의 시작 주소인 0xFFFFFF8008083728로 브랜치합니다.
 
01~02 번째 줄은 C 코드로 다음고 같이 표현할 수 있겠네요.
 
---
x2 = x1 & 0x3f;
 
if (x2)
   b 0xFFFFFF8008083728 ; b work_pending
---

+ Recent posts