Bagikan melalui


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

Lihat juga

Panggilan Fungsi Terbuka