使用內嵌組譯碼撰寫函式
Microsoft 特定的
注意
內嵌元件僅適用於 x86 目標。 如需 x64 或 ARM64 程式代碼中的類似功能,請使用 編譯程式內部函數。
如果您撰寫具有內嵌組譯程式碼的函式,很容易就能將引數傳遞至函式,並從函式傳回值。 下列範例將比較原先針對另一個組合語言撰寫,後來針對內嵌組合語言重寫的函式。 稱為 power2
的函式會收到兩個參數,並將第一個參數乘以 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
來停用此警告的產生。
END Microsoft 特定的