2014-12-18 4 views
2

나는 다음과 같은 코드가 작동하는 방법을 이해하기 위해 노력하고있어 :이 코드는 무엇을하려고합니까?

#define M32toX128(x128,m32) __asm__    \ 
    ("movddup %1, %0\n\t"       \ 
    "movsldup %0, %0"       \ 
    : "=&x"(x128) : "m"(m32)) 

난 단지 기본적인 조립 지식을 가지고. 그것을 사용하고있는 프로그램의 컨텍스트로부터 그리고 주위를 검색하면서, 저는 그것이 32 비트 변수를 복제하고 그 결과를 128 비트 변수에 저장하고 있다는 것을 이해했습니다.
내 질문은 :

  • %0%1가 무엇을 참조합니까?
  • 콜론 (:)의 기능은 무엇입니까?
  • 실행되는 실제 어셈블리 코드는 무엇입니까? 교체 후 의미 %ns, "=&x"(x128) ...

답변

2

gcc 인라인 어셈블리는 복잡한 짐승으로 여기서 자세히 설명하기는 어렵습니다. 빠른 개요에서 asm 블록의 일반적인 형식은 "template" : outputs : inputs : clobbers입니다. % 다음에 0부터 시작하는 인덱스를 사용하여 템플릿의 출력과 입력 (피연산자로 통칭)을 참조 할 수 있습니다. 따라서, %0x128을 나타내고, %1m32을 나타낸다. 각 피연산자에 대해 컴파일러가 해당 피연산자를 할당하는 방법을 알려주는 제약 조건을 지정할 수 있습니다. =&x은 사용 가능한 xmm 레지스터에서 초기 클로버 출력으로 x128을 할당하고, m은 피연산자에 메모리 주소를 사용한다는 것을 의미합니다. 마음에 드는 세부 사항은 manual을 참조하십시오.

생성되는 실제 어셈블리는 컴파일러에서 사용하는 피연산자에 따라 달라집니다. -S 옵션을 사용하여 어셈블리 목록을 요청하면이를 볼 수 있습니다. GCC 인라인 어셈블러 코스 GCC 및 아키텍처 고유의 것을

movddup x(%esp), %xmmN 
movsldup %xmmN, %xmmN 

주, 그것은는 해당 컴파일러 내장 함수를 사용하여 간단 의미 m32 가정하면 로컬 변수, 코드처럼 보일 수 있습니다.

2

이 코드는 GCC에서 어셈블러 단계로 전달됩니다. 이 과정에서 매크로의 일부가 대체됩니다. 설명서는 다음과 같습니다. http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html

%0%1은 C 매크로에 전달한 값으로 대체됩니다.

:은 매크로의 부분을 구분하는 데 사용됩니다. 첫 번째 필수 부분은 템플릿입니다. 두 번째는 출력 피연산자입니다. 전체 내용은 http://www.ibiblio.org/gferg/ldp/GCC-Inline-Assembly-HOWTO.html#s5을 참조하십시오.

이 경우 출력은 =이며 128 비트 (x)이며 매크로에 의해 휴지통으로 처리됩니다 (&). m은 이것이 메모리 피연산자임을 의미합니다.