Önsöz/Epilog kod yazarken dikkat edilmesi gereken noktalar
Microsoft özel
Kendi önsöz ve epilog kod dizileri yazmadan önce yığın çerçevesi nasıl düzenlendiği anlamak önemlidir.Nasıl kullanılacağını bilmek yararlıdır __LOCAL_SIZE simgesi.
Yığın çerçevesini düzeni
Bu örnek, bir 32-bit işlevinde görünebilir standart önsöz kodunu gösterir:
push ebp ; Save ebp
mov ebp, esp ; Set stack frame pointer
sub esp, localbytes ; Allocate space for locals
push <registers> ; Save registers
localbytes Değişkeni temsil yığında yerel değişkenler için gerekli olan bayt sayısı ve <registers> değişkeni yığında kaydedilecek kayıtları listesini gösteren bir yer tutucudur.Kayıtları dağıtmaya sonra yığın üzerinde diğer uygun verileri yerleştirebilirsiniz.Karşılık gelen epilog kod aşağıdadır:
pop <registers> ; Restore registers
mov esp, ebp ; Restore stack pointer
pop ebp ; Restore ebp
ret ; Return from function
Yığın her zaman aşağı (karşı yüksek bellek adresleri) büyür.Temel işaretçi (ebp) basılan değerine işaret ebp.Locals alanı başlar ebp-4.Yerel değişkenlere erişmek için bir uzaklığı hesaplamak ebp uygun değeri çıkarılarak tarafından ebp.
__LOCAL_SIZE
Derleyici bir sembol sağlar __LOCAL_SIZE, satır içi assembler kod bloğu, işlev önsöz kullanmak için.Bu simge, yerel değişkenler özel önsöz kod yığını çerçeve alanı ayırmak için kullanılır.
Derleyici değerini belirler __LOCAL_SIZE.Değeri tüm kullanıcı tanımlı yerel değişkenleri ve derleyici tarafından oluşturulan geçici değişkenleri bayt sayısıdır.__LOCAL_SIZE sadece bir anlık işlenen; kullanılabilir bir ifade kullanılamaz.Değil, değiştirmek veya bu sembol değerini yeniden tanımlamak gerekir.Örne?in:
mov eax, __LOCAL_SIZE ;Immediate operand--Okay
mov eax, [ebp - __LOCAL_SIZE] ;Error
Aşağıdaki örnek içeren özel önsöz ve epilog çýplak işlevinin kullandığı sequences __LOCAL_SIZE önsöz sıradaki simgesi:
// 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
}
}