Bagikan melalui


Menulis fungsi dengan rakitan inline

Khusus Microsoft

Catatan

Rakitan sebaris hanya tersedia untuk target x86. Untuk fungsionalitas serupa dalam kode x64 atau ARM64, gunakan intrinsik pengkompilasi.

Jika Anda menulis fungsi dengan kode rakitan sebaris, mudah untuk meneruskan argumen ke fungsi dan mengembalikan nilai darinya. Contoh berikut membandingkan fungsi yang pertama kali ditulis untuk perakitan terpisah lalu ditulis ulang untuk perakitan sebaris. Fungsi, yang disebut power2, menerima dua parameter, mengalikan parameter pertama dengan 2 ke kekuatan parameter kedua. Sebagai file perakitan terpisah, fungsi mungkin terlihat seperti ini:

; 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

Karena ditulis sebagai file perakit terpisah, fungsi memerlukan langkah-langkah perakitan dan tautan terpisah. Argumen fungsi C dan C++ biasanya diteruskan pada tumpukan, sehingga versi power2 fungsi ini mengakses argumennya dengan posisinya pada tumpukan. (Direktif MODEL , tersedia di MASM dan beberapa perakitan lainnya, juga memungkinkan Anda untuk mengakses argumen tumpukan dan variabel tumpukan lokal berdasarkan nama.)

Contoh

Program ini menulis power2 fungsi dengan kode rakitan sebaris:

// 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
}

Versi power2 sebaris fungsi mengacu pada argumennya berdasarkan nama dan muncul dalam file sumber yang sama dengan program lainnya. Versi ini juga memerlukan lebih sedikit instruksi rakitan.

Karena versi power2 sebaris tidak menjalankan pernyataan C return , itu menyebabkan peringatan yang tidak berbahaya jika Anda mengkompilasi pada tingkat peringatan 2 atau yang lebih tinggi. Fungsi ini mengembalikan nilai, tetapi pengkompilasi tidak dapat memberi tahunya dengan tidak adanya return pernyataan. Anda dapat menggunakan #pragma warning untuk menonaktifkan pembuatan peringatan ini.

END Khusus Microsoft

Baca juga

Menggunakan C atau C++ di __asm Blok