asm

asm

보통은 Crystal 코드만으로 충분하지만, 아주 드물게 CPU의 명령을 직접 다뤄야 하는 경우가 있어요. 파이버 전환이나 시스템 콜 같은 기능이 그런 부류인데, 그럴 때 asm 키워드로 인라인 어셈블리를 끼워 넣을 수 있어요.

출처: Crystal 공식 문서

본문

asm 키워드는 인라인 어셈블리를 삽입할 때 쓸 수 있어요. 파이버 전환(fiber switching)이나 시스템 콜처럼 아주 적은 수의 기능에서 필요한 경우가 있죠.

# x86-64 targets only
dst = 0
asm("mov $$1234, $0" : "=r"(dst))
dst # => 1234

asm 표현식은 콜론으로 구분된 최대 5개 섹션으로 이루어지고, 각 섹션 안의 구성 요소는 쉼표로 구분돼요. 예를 들어:

asm(
  # the assembly template string, following the
  # syntax for LLVM's integrated assembler
  "nop" :
  # output operands
  "=r"(foo), "=r"(bar) :
  # input operands
  "r"(1), "r"(baz) :
  # names of clobbered registers
  "eax", "memory" :
  # optional flags, corresponding to the LLVM IR
  # sideeffect / alignstack / inteldialect / unwind attributes
  "volatile", "alignstack", "intel", "unwind"
)

템플릿 문자열만 필수이고, 나머지 섹션은 비워두거나 생략할 수 있어요.

asm("nop")
asm("nop" :: "b"(1), "c"(2)) # output operands are empty

자세한 내용은 LLVM 문서의 인라인 어셈블러 표현식 섹션을 참고하세요.

더 알아보기

  • asm은 템플릿 문자열을 제외한 나머지 섹션을 모두 생략할 수 있다는 점이 핵심이에요.
  • 어셈블리 템플릿 문법은 LLVM의 통합 어셈블러 문법을 따르므로, LLVM 문서를 함께 보면 좋아요.