Aracılığıyla paylaş


Satır içi derlemeyle işlevler yazma

Microsoft'a Özgü

Not

Satır içi derleme yalnızca x86 hedefleri için kullanılabilir. x64 veya ARM64 kodundaki benzer işlevler için derleyici iç işlevlerini kullanın.

Satır içi derleme koduyla bir işlev yazarsanız, bağımsız değişkenleri işleve geçirmek ve işlevden bir değer döndürmek kolaydır. Aşağıdaki örneklerde, önce ayrı bir derleyici için yazılmış bir işlev karşılaştırılır ve ardından satır içi derleyici için yeniden yazılır. adlı power2işlev, ilk parametreyi ikinci parametrenin gücüyle 2 ile çarparak iki parametre alır. Ayrı bir assembler dosyası olarak işlev şu şekilde görünebilir:

; 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

Ayrı bir assembler dosyası olarak yazılmasından dolayı işlev ayrı derleme ve bağlantı adımları gerektirir. C ve C++ işlev bağımsız değişkenleri genellikle yığına geçirilir, bu nedenle işlevin power2 bu sürümü yığındaki konumlarıyla bağımsız değişkenlerine erişir. MODEL(MASM'de ve diğer bazı derleyicilerde bulunan yönergesi, yığın bağımsız değişkenlerine ve yerel yığın değişkenlerine ada göre erişmenizi de sağlar.)

Örnek

Bu program, işlevi satır içi derleme koduyla yazar 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
}

İşlevin power2 satır içi sürümü bağımsız değişkenlerini ada göre ifade eder ve programın geri kalanıyla aynı kaynak dosyada görünür. Bu sürüm için daha az derleme yönergesi de gerekir.

satır içi sürümü power2 bir C return deyimi yürütmediğinden, uyarı düzeyi 2 veya daha yüksek bir derleme yaparsanız zararsız bir uyarıya neden olur. İşlev bir değer döndürür, ancak derleyici bir return deyimi olmadığında değerini anlayamaz. Bu uyarının oluşturulmasını devre dışı bırakmak için kullanabilirsiniz #pragma warning .

END Microsoft'a Özgü

Ayrıca bkz.

Bloklarda __asm C veya C++ Kullanma