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 문서를 함께 보면 좋아요.