[Rust 공식문서 한국어 정리] 63. Rust 인라인 어셈블리 가이드
[Rust 공식문서 한국어 정리] 63. Rust 인라인 어셈블리 가이드
원문 제목: Inline Assembly — The Rust Reference
작성자: Rust Language Team
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📌 1. 서론 — 이 문서가 다루는 내용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
이 문서는 Rust에서 안정적인 인라인 어셈블리(Inline Assembly) 문법을 사용하는 방법을 설명합니다.
asm! 매크로를 사용하여 Rust 코드 내에 어셈블리를 삽입하고, 레지스터 제약, 입출력 피연산자, clobber, 레이블 등을 다룹니다.
저수준 하드웨어 제어, OS 개발, 임베디드, 그리고 성능 크리티컬한 코드 경로에서 어셈블리를 활용하는 방법을 중심으로 설명합니다.
unsafe 영역에서만 사용 가능한 인라인 어셈블리의 위험성과, 대안을 먼저 고려해야 하는 이유도 포함합니다.
시스템 프로그래밍과 성능 최적화의 최전선에서 작업하는 고급 Rust 개발자에게 필수적입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔑 2. 핵심 개념 4가지
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
① asm! 매크로: Rust 코드 내에 인라인 어셈블리를 삽입하는 매크로입니다.
② Input/Output Operands: Rust 변수를 어셈블리 명령의 피연산자로 매핑하는 제약 조건입니다.
③ Clobbers: 어셈블리 블록이 변경하는 레지스터나 메모리를 컴파일러에 알리는 선언입니다.
④ Options: pure, nomem, readonly 등의 옵션으로 컴파일러 최적화 힌트를 제공합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📖 3. 주요 내용 상세
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
인라인 어셈블리는 unsafe 블록 내에서 asm! 매크로로 사용합니다.
unsafe { asm!("nop"); } 형태로, 문자열 리터럴에 어셈블리 명령을 작성합니다.
타겟 아키텍처의 어셈블리 문법을 따라야 하며, x86, ARM, RISC-V 등 각각의 문법이 다릅니다.
입출력 피연산자는 in, out, inout, lateout 등의 제약으로 선언합니다.
asm!("add {0}, {1}", inout(reg) a, in(reg) b) 형태로, Rust 변수를 레지스터나 메모리 위치에 바인딩합니다.
제약 조건은 reg, mem, const, sym 등이 있으며, 컴파일러가 적절한 위치를 선택합니다.
clobber는 어셈블리가 수정하지만 출력으로 선언되지 않은 레지스터를 컴파일러에 알립니다.
out("rax") _ 형태로 사용하며, 플래그 레지스터나 범용 레지스터의 변경을 선언합니다.
memory clobber는 어셈블리가 임의의 메모리를 수정할 수 있음을 나타내며, 컴파일러의 메모리 최적화를 억제합니다.
옵션은 asm!의 최적화 행동을 제어합니다.
pure는 동일한 입력에 대해 동일한 출력을 보장하여 컴파일러가 중복 호출을 제거할 수 있게 합니다.
nomem는 메모리에 접근하지 않음을 보장하고, readonly는 읽기만 수행함을 보장합니다.
정확한 옵션은 컴파일러가 더 적극적으로 최적화할 수 있게 하지만, 잘못 지정하면 undefined behavior가 발생합니다.
인라인 어셈블리는 최후의 수단으로 사용해야 합니다.
대부분의 경우 std::arch의 내장 함수(intrinsics)나 컴파일러 자동 벡터화가 더 안전하고 효과적입니다.
어셈블리는 컴파일러 최적화를 방해하고, 이식성을 해치며, 메모리 안전성을 완전히 포기하는 영역입니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🛠 4. 실전 활용
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
OS 개발에서 CR0, CR3 등의 특수 레지스터를 읽고 쓸 때 인라인 어셈블리를 사용합니다.
커널의 컨텍스트 스위치나 시스템 콜 진입/퇴장 코드에서 어셈블리로 정밀한 레지스터 제어를 수행합니다.
std::arch에 없는 최신 CPU 명령어를 직접 사용할 때만 asm!을 고려합니다.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
✅ 5. 정리
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
인라인 어셈블리는 Rust에서 가장 강력하면서도 위험한 기능입니다.
입출력 피연산자와 clobber를 정확히 선언하고, 옵션을 보수적으로 사용하세요.
가능한 한 intrinsics나 고수준 API를 먼저 사용하고, 어셈블리는 정말 필요할 때만 최후의 수단으로 삼으세요.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
🔗 출처 링크
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
원문: https://doc.rust-lang.org/stable/core/arch/index.html
Rust Reference Inline Assembly: https://doc.rust-lang.org/reference/inline-assembly.html
#Rust #InlineAssembly #ASM #SystemsProgramming #Performance #Unsafe #번역

오뉴노노 님의 최근 댓글
ㅋㅋㅋㅋㅋ 2019 01.14 잘 읽었습니다 2018 12.30 포인트가 없어서 아직 시작을 못하고있는데요! 글은 잘 읽었습니다! 포인트 쌓고 도전할거에요 2018 12.30