다음을 통해 공유


__Asm 블록 C 매크로로 정의

Microsoft 전용

매크로 c 소스 코드에 어셈블리 코드를 삽입 하는 편리한 방법을 제공 하지만 매크로 한 논리 줄으로 확장 하기 때문에 이러한 특별 한 주의가 요구 됩니다.문제 없이 매크로 작성 하려면 다음이 규칙을 따라야 합니다.

  • 로 __asm 중괄호를 차단 합니다.

  • 배치는 __asm 각 어셈블리 명령 앞에 키워드.

  • 이전 스타일의 C 주석을 사용 하 여 ( /* comment */) 어셈블리 스타일 메모 대신 ( ; comment) 또는 C 한 줄 주석 ( // comment).

설명 하기 위해 다음 예제에서는 간단한 매크로 정의 합니다.

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

첫 눈에 마지막 3 __asm 키워드 것이 불필요 합니다.그러나 매크로 한 줄으로 확장 하기 때문에, 필요 합니다.

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

세 번째 및 네 번째 __asm 문을 구분 기호로 키워드가 필요 합니다.문 구분 기호 인식 __asm 블록은 줄 바꿈 문자 및 __asm 키워드입니다.하나의 논리적 줄 매크로로 정의 된 블록입니다 때문에 각 명령 구분 해야 __asm.

중괄호도 반드시 필요합니다.이 생략 하면 컴파일러 C 또는 C++ 문 같은 줄에 있는 매크로 호출의 오른쪽으로 혼동 될 수 있습니다.닫는 중괄호 없이 컴파일러는 어셈블리 코드가 중지 되 고 알 수 없습니다 C 또는 C++ 문을 볼 수에 __asm 블록이 어셈블리 지시로.

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

__asm 블록 C 매크로 인수 때 기록 됩니다.일반적인 C 매크로 달리는 __asm 매크로 값을 반환할 수 없습니다.따라서 C 또는 C++ 식에 이러한 매크로 사용할 수 없습니다.

이 형식의 매크로 구분 없이 호출 되지 않도록 해야 합니다.예를 들어, 호출 하는 어셈블리 언어 매크로 함수의 선언 있는 __fastcall 규칙이 예기치 않은 결과가 발생할 수 있습니다.(참조 하십시오 를 사용 하 고 레지스터를 인라인 어셈블리를 유지입니다.)

Microsoft 특정 끝

참고 항목

참조

인라인 어셈블러