分享方式:


使用內嵌組譯碼撰寫函式

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 特定的

另請參閱

在區塊中使用 __asm C 或 C++