다음을 통해 공유


__asm 블록을 C 매크로로 정의

Microsoft 전용

C 매크로를 사용하면 소스 코드에 어셈블리 코드를 편리하게 삽입할 수 있지만 매크로가 단일 논리 줄로 확장되기 때문에 사용 시 특별히 주의해야 합니다. 문제가 없는 매크로를 만들려면 다음 규칙을 따르십시오.

  • __asm 블록을 중괄호로 묶습니다.

  • 각 어셈블리 명령 앞에 __asm 키워드를 배치합니다.

  • 어셈블리 스타일 주석(/* comment */) 또는 한 줄로 된 C 주석(; comment) 대신 이전 스타일 C 주석(// comment)을 사용합니다.

다음 예제에서는 간단한 매크로를 정의합니다.

#define PORTIO __asm      \
/* Port output */         \
{                         \
   __asm mov al, 2        \
   __asm mov dx, 0xD007   \
   __asm out dx, al       \
}

처음에는 마지막 세 __asm 키워드가 불필요한 것처럼 보입니다. 그러나 매크로가 단일 줄로 확장되므로 세 키워드가 필요합니다.

__asm /* Port output */ { __asm mov al, 2  __asm mov dx, 0xD007 __asm out dx, al }

세 번째 및 네 번째 __asm 키워드는 문 구분 기호로 필요합니다. __asm 블록에서 인식되는 유일한 문 구분 기호는 줄 바꿈 문자 및 __asm 키워드입니다. 매크로로 정의된 블록은 하나의 논리 줄이므로 각 명령을 __asm으로 구분해야 합니다.

중괄호도 필요합니다. 중괄호를 생략하면 동일한 줄의 매크로 호출 오른쪽에 있는 C 또는 C++ 문 때문에 컴파일러에 혼동이 있을 수 있습니다. 닫는 중괄호가 없으면 컴파일러가 어셈블리 코드가 중지되는 위치를 알 수 없으며, __asm 블록 뒤에 있는 C 또는 C++ 문을 어셈블리 명령으로 인식합니다.

세미콜론(;)으로 시작하는 어셈블리 스타일 주석은 줄의 끝까지 계속됩니다. 컴파일러는 논리 줄의 끝까지 주석 이후의 모든 항목을 무시하므로 매크로에서 문제가 발생합니다. 한 줄로 된 C 또는 C++ 주석도 마찬가지입니다(// comment). 오류를 방지하려면 매크로로 정의된 /* comment */ 블록에 이전 스타일 C 주석(__asm)을 사용하십시오.

C 매크로로 작성된 __asm 블록은 인수를 사용할 수 있습니다. 그러나 일반 C 매크로와 달리 __asm 매크로는 값을 반환할 수 없습니다. 따라서 C 또는 C++ 식에 이러한 매크로를 사용할 수 없습니다.

이 형식의 매크로를 무차별적으로 호출하지 않도록 하십시오. 예를 들어, __fastcall 규칙으로 선언된 함수에서 어셈블리 언어 매크로를 호출하면 예기치 않은 결과가 발생할 수 있습니다. (참조) 인라인 어셈블리에서 레지스터 사용 및 유지

Microsoft 전용 종료

참고 항목

인라인 어셈블러