Ö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
}
}