__asm

Microsoft 전용

__asm 키워드는 인라인 어셈블러를 호출하고 C 또는 C++ 문을 사용할 수 있는 모든 곳에 표시될 수 있습니다. 그것은 그 자체로 표시 할 수 없습니다. 어셈블리 명령, 중괄호로 묶인 명령 그룹 또는 최소한 빈 중괄호 쌍이 뒤따라야 합니다. 여기서 "__asm 블록"이라는 용어는 중괄호에 상관없이 명령 또는 명령 그룹을 참조합니다.

참고 항목

표준 C++ asm 키워드에 대한 Visual C++ 지원은 컴파일러가 키워드에 대한 오류는 생성하지 않는 사실로 제한됩니다. 그러나 asm 블록은 의미 있는 코드를 생성하지 않습니다. __asm 대신 asm를 사용합니다.

문법

asm-block:
__asmassembly-instruction;opt
__asm {assembly-instruction-list};opt

assembly-instruction-list:
assembly-instruction;opt
assembly-instruction assembly-instruction-list;opt;

설명

__asm 키워드가 괄호 없이 사용되는 경우 줄의 나머지가 어셈블리 언어 문임을 의미합니다. 이 키워드가 중괄호와 함께 사용되는 경우 중괄호 사이의 각 줄이 어셈블리 언어 문임을 의미합니다. 이전 버전과의 호환성을 위해 _asm__asm의 동의어입니다.

__asm 키워드가 문 구분 기호이므로 어셈블리 명령을 동일한 줄에 배치할 수 있습니다.

Visual Studio 2005 이전의 지침

__asm int 3

에서는 /clr컴파일할 때 네이티브 코드가 생성되지 않았습니다. 컴파일러는 명령을 CLR 중단 명령으로 변환했습니다.

이제 __asm int 3을 사용하면 함수의 네이티브 코드가 생성됩니다. 함수가 코드에서 중단점을 발생시키고 해당 함수를 MSIL로 컴파일하려면 __debugbreak 사용합니다.

이전 버전 _asm 과의 호환성을 위해 __asm 컴파일러 옵션 /Za(언어 확장 사용 안 함) 를 지정하지 않는 한 동의어입니다.

예시

아래 코드 조각은 중괄호로 묶여 있는 간단한 __asm 블록입니다.

__asm {
   mov al, 2
   mov dx, 0xD007
   out dx, al
}

또는 __asm을 각 어셈블리 명령 앞에 배치할 수 있습니다.

__asm mov al, 2
__asm mov dx, 0xD007
__asm out dx, al

__asm 키워드가 문 구분 기호이므로 다음과 같이 어셈블리 명령을 동일한 줄에 배치할 수도 있습니다.

__asm mov al, 2   __asm mov dx, 0xD007   __asm out dx, al

세 가지 예제 모두 동일한 코드를 생성하지만 첫 번째 스타일(__asm 블록을 중괄호로 묶음)이 약간 더 유리합니다. 중괄호는 C 또는 C++ 코드에서 어셈블리 코드를 명확하게 구분하고 __asm 키워드의 불필요한 반복을 방지합니다. 중괄호는 모호성을 방지할 수도 있습니다. C 또는 C++ 문을 __asm 블록과 동일한 줄에 배치하려면 해당 블록을 중괄호로 묶어야 합니다. 중괄호가 없으면 컴파일러는 어셈블리 코드가 중지되는 위치를 알 수 없으며 C 또는 C++ 문이 시작됩니다. 마지막으로, 중괄호 안의 텍스트는 일반 MASM 텍스트와 형식이 동일하므로 기존 MASM 소스 파일의 텍스트를 쉽게 잘라내고 붙여 넣을 수 있습니다.

C 및 C++의 중괄호와 달리 __asm 블록을 묶는 중괄호는 변수 범위에 영향을 주지 않습니다. 블록을 중첩 __asm 할 수도 있습니다. 중첩은 변수 범위에 영향을 주지 않습니다.

Microsoft 전용 종료

참고 항목

키워드
인라인 어셈블러