Skip to the content.

UBFX

Summary

커널 프로젝트가 앞으로 PL011 UART 드라이버의 상태 레지스터를 읽거나, ARM64 시스템 레지스터(mpidr_el1 같은 신분증 레지스터)에서 특정 필드 값만 쏙쏙 뽑아낼 때, 이 UBFX야말로 매일 아침 숨 쉬듯 쓰게 될 커널 개발의 0순위 마법 지팡이입니다.


🧠 UBFX: 상남자의 비트 가르기 메커니즘 (단 1클럭의 기적)


🧱 코드샘플

“시스템 레지스터나 센서 데이터에서 원하는 핵심 정보(비트필드)만 광속으로 추출하는” 실전 예제

// =========================================================================
// Hun ARM64 Mnemonic Dictionary - Open Example
// Mnemonic: UBFX (Unsigned Bitfield Extract)
// Description: 레지스터의 특정 비트 구간을 뽑아내어 하위로 정렬하고 상위는 0으로 채움
// =========================================================================

.global _hun_ubfx_extract_example
.text
.align 3

_hun_ubfx_extract_example:

    // [무대 세팅] 16진수 날것의 무거운 데이터 뭉치를 준비합니다.
    // 0x12345678_ABCD9876 이라는 거대한 64비트 값이 X1에 들어있다고 가정합시다.
    // (여기서 우리는 중간에 낀 'ABCD'라는 16비트 알맹이만 쏙 빼먹고 싶습니다!)
    MOVZ X1, #0x9876, LSL #0
    MOVK X1, #0xABCD, LSL #16
    MOVK X1, #0x5678, LSL #32
    MOVK X1, #0x1234, LSL #48

    // 1. [UBFX 단판 승부] 칼날을 들이대고 정확한 비트 위치를 도려냅니다.
    // 구문: UBFX <대상>, <소스>, #<시작비트위치>, #<뽑아낼비트폭>
    //
    // - 시작비트 #16: X1 레지스터의 하위 16번 비트(즉, ABCD의 시작점)부터 시작해서
    // - 비트폭 #16: 딱 16비트만큼(즉, ABCD 4자리 문자 분량)을 통째로 잘라내어,
    // - 대상 X0의 맨 하위(0번 비트) 자리에 정렬하여 꽂아 넣습니다!
    // - 동시에 X0의 나머지 상위 모든 비트(비트 16~63)는 깨끗하게 0으로 지워줍니다.
    UBFX    X0, X1, #16, #16

    // [최종 결과] X0 = 0x000000000000ABCD
    // 복잡한 연산 없이 단 1줄, 1클럭 만에 순수한 알맹이 'ABCD'만 대장 레지스터 X0에 안착!
    RET

🎯 UBFX 구문 요약