CALLING CONVENTION
cdecl
cdecl (ingat c declaration) adalah calling convention yang berasal dari Microsoft compiler untuk bahasa pemrograman c dan digunakan banyak compiler pada arsitektur x86. Pada cdecl subroutine argument disimpan di stack. Nilai integer dan alamat memori di return ke register eax, nilai floating point di register ST0 (x87 ST0). Register EAX, ECX dan EDX adalah caller-saved dan sisanya callee-saved. x87 floating point register dari ST0 sampai ST7 harus kosong (popped or freed) ketika memanggil fungsi baru dan ST1 sampai ST7 harus kosong saat keluar dari suatu fungsi. ST0 juga harus kosong ketika tidak digunakan sebagai nilai return.
Pada konteks bahasa pemrograman c, argumen fungsi di push ke stack dari kanan ke kiri. Argumen paling kanan di push pertama dan argumen paling kiri di push terakhir.
Berikut kode snippetnya :
int terpanggil(int, int, int);
int pemanggil(void)
{
return terpanggil(1, 2, 3) + 5;
}
Berikut kode assembly 32bit yang mungkin dihasilkan (sintaks intel) :
pemanggil:
; membuat call frame baru
; (beberapa compiler mungkin menghasilkan instruksi 'enter' sebagai penggantinya)
push ebp ; save call frame lama
mov ebp, esp ; initialize call frame baru
; push call arguments, dari kanan ke kiri
; (beberapa compiler mungkin mengurangi esp dengan ruang yang diperlukan,
; kemudian menulis argumen secara langsung seperti dibawah ini.
; Instruksi 'enter' juga bisa melakukan yang seperti ini)
; sub esp, 12 : instruksi 'enter' dapat melakukan ini untuk kita
; mov [ebp-4], 3 : atau mov [esp+8], 3
; mov [ebp-8], 2 : atau mov [esp+4], 2
; mov [ebp-12], 1 : atau mov [esp], 1
push 3
push 2
push 1
call terpanggil ; call subroutine 'terpanggil'
add esp, 12 ; remove call arguments dari frame
add eax, 5 ; tambahkan 5 ke nilai return
; (eax adalah nilai return dari terpanggil kita,
; jadi kita tidak perlu memindahkannya ke variable lokal)
; restore call frame lama
; (beberapa compiler mungkin menghasilkan instruksi 'leave' sebagai penggantinya)
mov esp, ebp ; kebanyakan calling convention menjadikan ebp sebagai terpanggil-saved,
; yaitu disimpan setelah memanggil terpanggil.
; bagaimanapun itu tetap menunjuk ke awal stack frame kita.
; kita perlu memastikan terpanggil tidak mengubah ebp,
; jadi kita perlu pastikan
; ia menggunakan calling convention yang melakukan ini
pop ebp ; restore call frame lama
ret ; return
pemanggil atau caller membersihkan/ merestore stack setelah fungsi mereturn. cdecl adalah calling convention default untuk compiler c. Meskipun banyak compiler menyediakan pilihan untuk secara otomatis mengubah calling convention yang digunakan. Untuk mendefinisikan secara manual sebuah fungsi sebagai cdecl, beberapa mendukung sintaks berikut :
return_type __cdecl nama_fungsi();
Tidak ada komentar:
Posting Komentar