Pertimbangan untuk Menulis Kode Prolog/Epilog
Khusus Microsoft
Sebelum menulis urutan kode prolog dan epilog Anda sendiri, penting untuk memahami bagaimana bingkai tumpukan ditata. Ini juga berguna untuk mengetahui cara menggunakan __LOCAL_SIZE
simbol .
Tata Letak Bingkai Tumpukan
Contoh ini menunjukkan kode prolog standar yang mungkin muncul dalam fungsi 32-bit:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
Variabel localbytes
mewakili jumlah byte yang diperlukan pada tumpukan untuk variabel lokal, dan variabel <registers>
adalah tempat penampung yang mewakili daftar register yang akan disimpan pada tumpukan. Setelah mendorong register, Anda dapat menempatkan data lain yang sesuai pada tumpukan. Berikut ini adalah kode epilog yang sesuai:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
Tumpukan selalu tumbuh ke bawah (mulai dari alamat memori tinggi ke rendah). Penunjuk dasar (ebp
) menunjuk ke nilai yang didorong dari ebp
. Daerah lokal dimulai di ebp-4
. Untuk mengakses variabel lokal, hitung offset dari ebp
dengan mengurangi nilai yang sesuai dari ebp
.
__LOCAL_SIZE
Pengkompilasi menyediakan simbol, __LOCAL_SIZE
, untuk digunakan dalam blok perakitan sebaris kode prolog fungsi. Simbol ini digunakan untuk mengalokasikan ruang untuk variabel lokal pada bingkai tumpukan dalam kode prolog kustom.
Pengkompilasi menentukan nilai __LOCAL_SIZE
. Nilainya adalah jumlah total byte dari semua variabel lokal yang ditentukan pengguna dan variabel sementara yang dihasilkan kompilator. __LOCAL_SIZE
hanya dapat digunakan sebagai operan langsung; tidak dapat digunakan dalam ekspresi. Anda tidak boleh mengubah atau menentukan ulang nilai simbol ini. Contohnya:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
Contoh fungsi telanjang berikut yang berisi urutan prolog dan epilog kustom menggunakan __LOCAL_SIZE
simbol dalam urutan prolog:
// the__local_size_symbol.cpp
// processor: x86
__declspec ( naked ) int main() {
int i;
int j;
__asm { /* prolog */
push ebp
mov ebp, esp
sub esp, __LOCAL_SIZE
}
/* Function body */
__asm { /* epilog */
mov esp, ebp
pop ebp
ret
}
}
END Khusus Microsoft