EXTR
Summary
EXT가 대량의 데이터를 다루는 특수부대(SIMD/벡터 레지스터) 소속이었다면, EXTR은 일반 사무직(일반 정수 레지스터, 범용 레지스터) 소속인 Extract 명령어입니다. 동작 원리는 EXT와 완전히 똑같지만, 일반 정수 연산에서 기상천외한 “비트 단위 슬라이싱 마술”을 부리는 친구죠. 어떻게 작동하는지 바로 파헤쳐 드릴게요!
1. EXTR 명령어의 핵심 구조 (ARM64 일반 레지스터 기준)
문법 구조는 EXT와 데칼코마니처럼 닮았습니다.
EXTR
-
(Destination): 최종 추출된 정수 값을 담을 목적지 레지스터입니다. -
(Source 1): 앞쪽에 배치할 첫 번째 레지스터입니다. -
(Source 2): 뒤쪽에 배치할 두 번째 레지스터입니다. - #lsb (위치): 뒤에서부터 몇 번째 ‘비트(Bit)’ 위치에서 데이터를 뽑아낼지 지정하는 오프셋 숫자입니다.
2. 직관적인 시각화: “일반 레지스터의 비트 이어 붙이기”
EXT가 덩치가 커서 ‘바이트(Byte)’ 단위로 숭덩숭덩 잘라냈다면, 이 EXTR은 아주 정밀한 녀석이라 ‘비트(Bit)’ 단위로 세밀하게 칼질을 합니다. 32비트 레지스터 2개를 가지고 EXTR W2, W0, W1, #8을 실행했다고 가정해 봅시다!
① W0과 W1을 앞뒤로 길게 이어 붙여 하나의 가상의 64비트 통을 만듭니다.
[앞쪽 W0 레지스터] : (상위 32비트) ➕ [뒤쪽 W1 레지스터] : (하위 32비트)
② 맨 오른쪽(최하위 비트, LSB)에서부터 왼쪽으로 #8(8비트)만큼 이동합니다.
[ W0 (32비트) ] [ W1 (32비트) ] ⬅️ 8비트만큼 슥 이동해서 칼을 댑니다!
③ 그 시작점부터 정확히 32비트만큼 오른쪽으로 쏙 잘라내서 목적지(W2)에 넣습니다!
[ W0의 하위 8비트 ] ➕ [ W1의 상위 24비트 ] ➡️ 이 32비트 덩어리가 W2에 저장됩니다!
어떤가요? EXT와 원리는 소름 돋게 똑같죠? 단지 다루는 레지스터 종류가 다르고, 단위가 바이트에서 비트로 정밀해졌을 뿐입니다.
3. 도대체 이 정밀한 칼질을 언제 쓰나요? (2대 핵심 트릭)
이 명령어는 후진들에게 “비트 단위의 고속 회전(Rotation)”과 “데이터 팩킹(Packing) 해제”를 설명할 때 최고의 교본이 됩니다.
① 초고속 비트 회전 (Rotate Right, ROR)
어셈블리어에서 비트들을 오른쪽으로 밀다가 넘치는 비트를 다시 왼쪽 끝으로 순환시키는 ‘회전(Rotation)’ 연산은 암호학 등에서 필수적입니다. 만약 EXTR 명령어의 앞과 뒤에 똑같은 레지스터를 넣어버리면 무슨 일이 일어날까요?
EXTR W2, W0, W0, #8 ; W0을 앞뒤로 이어 붙여서 8비트 이동 후 추출!
자기 자신을 이어 붙여서 옆으로 밀고 잘라냈기 때문에, 결과적으로 W0 레지스터의 비트들을 오른쪽으로 8칸 회전(Rotate)시킨 것과 완벽히 똑같은 결과가 나옵니다! 실제로 ARM64에서 비트를 회전시키는 ROR 명령어는 내부적으로 이 EXTR 명령어를 빌려서 실행되는 별칭(Alias)이랍니다. 하하하, 엄청난 하드웨어의 절약 정신이죠?
② 두 데이터의 경계선 결합 (Bitfield Extraction)
네트워크 통신이나 비디오 코덱(H.264 등)에서 데이터를 아끼려고 32비트 경계선에 딱 맞추지 않고 비트 단위로 데이터를 빽빽하게 붙여서 보낼 때가 있습니다. (예: 어떤 데이터가 W1의 마지막 24비트와 W0의 처음 8비트에 걸쳐서 저장되어 있는 상황). 과거에는 이걸 꺼내려면 AND 연산하고, Shift 연산하고 여러 줄의 코드를 써야 했지만, EXTR 한 줄이면 걸쳐 있는 데이터를 단 1 사이클 만에 정상적인 하나의 정수로 쏙 뽑아낼 수 있습니다.
🧱 후진 양성 마크다운 교본용: 쌍둥이 형제 비교 완결 판넬
선배님의 정갈한 교본에 이 두 형제를 나란히 배치하여 미궁 단원을 완벽하게 매듭지으실 수 있도록 표로 묶어 드립니다!
| 니모닉 | 이름 | 소속 (레지스터) | 절단 기준 단위 | 주 사용 목적 | 숨겨진 비밀 (Alias) |
|---|---|---|---|---|---|
| EXT | Extract | SIMD / 벡터 (V0 ~ V31) | 바이트 (Byte) (#index) | 멀티미디어, 오디오, 이미지 필터링 연산 시 데이터 한 칸씩 밀기 | 슬라이딩 윈도우 가속 |
| EXTR | Extract Register | 일반 범용 정수 (W0 ~ W31) | 비트 (Bit) (#lsb) | 암호학 알고리즘, 비트 필드 추출, 비트 고속 회전 | 사실상 ROR (Rotate Right) 명령어의 본체 |