Clobbers

Clobbers (클로버)

인라인 어셈블리에서 클로버(clobber) 레지스터가 무엇인지, 그리고 왜 반드시 모두 선언해야 하는지를 살펴봐요. 출처: Zig Documentation

본문

클로버(clobber)는 어셈블리 코드가 실행되는 동안 그 값을 보존하지 않을 레지스터들의 집합이에요. 여기에는 출력(output)이나 입력(input) 레지스터는 포함되지 않아요.

특별한 클로버 값 "memory"는 어셈블리가 선언된 간접 출력(indirect output)이 가리키는 메모리뿐 아니라, 아무렇게나 선언되지 않은 임의의 메모리 위치에도 쓰기(쓰고 지우기)를 발생시킨다는 뜻이에요.

주어진 인라인 어셈블리 표현식에 대해 클로버의 전체 집합을 제대로 선언하지 않으면, 검사되지 않는 채로 남는 Illegal Behavior(불법 동작)이 돼요. 즉, 컴파일러가 이 실수를 잡아주지 않으니 우리가 직접 전부 빠짐없이 챙겨야 해요.

더 알아보기(Learn more)

  • Global Assembly — 전역 수준의 어셈블리 작성법
  • "memory" 클로버는 메모리 배리어(memory barrier) 역할도 겸하므로, 어셈블리 코드가 메모리를 건드릴 때는 빠뜨리지 않는 것이 안전해요.