다음을 통해 공유


인라인 어셈블리 함수를 작성합니다.

Microsoft 전용

인라인 어셈블리 코드를 사용 하는 함수를 작성 하는 경우 인수를 함수에 전달 하 고 값을 반환 하는 것이 더 쉽습니다.다음 예제에서는 먼저 별도 어셈블러에 대 한 기록 및 인라인 어셈블러에 대 한 다음 다시 작성 하는 함수를 비교 합니다.호출 하는 함수를 power2, 2의 두 번째 매개 변수에서 첫 번째 매개 변수를 곱하면 두 매개 변수를 받습니다.별도 어셈블러에 대 한 기록, 함수가 다음과 같을 수 있습니다.

; POWER.ASM
; Compute the power of an integer
;
       PUBLIC _power2
_TEXT SEGMENT WORD PUBLIC 'CODE'
_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+4] ; Get first argument
        mov ecx, [ebp+6] ; Get second argument
        shl eax, cl     ; EAX = EAX * ( 2 ^ CL )
        pop ebp         ; Restore EBP
        ret             ; Return with sum in EAX

_power2 ENDP
_TEXT   ENDS
        END

별도 어셈블러에 대 한 작성 된 것 이므로 함수는 별도 소스 파일 및 어셈블리와 연결 단계가 필요 합니다.C 및 C++ 함수의 인수는 스택에 전달 됩니다 일반적으로 따라서이 버전의 power2 함수 인수는 스택의 해당 위치에 액세스 하는.(이때의 모델 지시문을 MASM 및 일부 다른 assemblers 사용할 수 또한 스택의 인수 및 로컬 스택 변수 이름을 사용 하 여 액세스할 수 있습니다.)

예제

이 프로그램이 기록의 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++를 사용 하 여