다음을 통해 공유


인라인 어셈블리로 함수 작성

Microsoft 전용

참고 항목

인라인 어셈블리는 x86 대상에만 사용할 수 있습니다. x64 또는 ARM64 코드에서 유사한 기능을 사용하려면 컴파일러 내장 함수를 사용합니다.

인라인 어셈블리 코드를 사용하여 함수를 작성하는 경우 간편하게 인수를 함수에 전달하고 값을 반환할 수 있습니다. 다음 예제에서는 별도의 어셈블러에 대해 먼저 작성된 후 인라인 어셈블러에 대해 다시 작성된 함수를 비교합니다. 호출된 power2 함수가 매개 변수 2개를 수신하고 첫 번째 매개 변수에 2를 곱하여 두 번째 매개 변수의 거듭제곱을 구합니다. 별도의 어셈블러 파일로 함수는 다음과 같이 표시될 수 있습니다.

; power2.asm 
; x86 code for C interop
; Command line: ml /c /Cx /W3 /WX power2.asm 
        .686P
        .XMM
        .MODEL  flat

PUBLIC  _power2
; int power2(int num, int power);
; computes num x 2^power
_TEXT   SEGMENT
_power2 PROC
        push    ebp             ; save EBP
        mov     ebp, esp        ; Move ESP into EBP so we can refer
                                ;   to arguments on the stack
        mov     eax, [ebp+8]    ; load first argument
        mov     ecx, [ebp+12]   ; load second argument
        shl     eax, cl         ; compute result in EAX
        pop     ebp             ; restore EBP
        ret
_power2 ENDP
_TEXT   ENDS
END

별도의 어셈블러 파일로 작성되므로 함수에는 별도의 어셈블리 및 링크 단계가 필요합니다. C 및 C++ 함수 인수는 대개 스택에서 전달되므로 이 버전의 power2 함수는 스택의 위치를 기준으로 인수에 액세스합니다. MODEL(MASM 및 일부 다른 어셈블러에서 사용할 수 있는 지시문을 사용하면 이름으로 스택 인수 및 로컬 스택 변수에 액세스할 수도 있습니다.)

예시

이 프로그램은 인라인 어셈블리 코드를 사용하여 power2 함수를 작성합니다.

// Power2_inline_asm.c
// compile with: /EHsc
// processor: x86

#include <stdio.h>

int power2( int num, int power );

int main( void )
{
    printf_s( "3 times 2 to the power of 5 is %d\n", \
              power2( 3, 5) );
}
int power2( int num, int power )
{
   __asm
   {
      mov eax, num    ; Get first argument
      mov ecx, power  ; Get second argument
      shl eax, cl     ; EAX = EAX * ( 2 to the power of CL )
   }
   // Return with result in EAX
}

인라인 버전의 power2 함수는 이름으로 인수를 참조하며 프로그램의 나머지 부분과 동일한 소스 파일에 나타납니다. 또한 이 버전에는 더 적은 어셈블리 명령이 필요합니다.

인라인 버전의 power2가 C return 문을 실행하지 않으므로 경고 수준 2 이상에서 컴파일할 경우 해롭지 않은 경고가 발생합니다. 함수는 값을 반환하지만 컴파일러는 문이 없는 경우 return 이를 알 수 없습니다. 이 경고의 생성을 사용하지 않도록 설정하는 데 사용할 #pragma warning 수 있습니다.

Microsoft 전용 종료

참고 항목

블록에서 __asm C 또는 C++ 사용