인라인 어셈블리로 함수 작성
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 전용 종료