Arm Linux Kernel Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

8179
1390
307630


[ARMv8] cbnz 명령어 Armv7: 어셈블리 명령어

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
---

덧글

댓글 입력 영역