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
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk