Sadece x64 montajını öğrenmeye başladım ve fonksiyonlar, argümanlar ve yığın hakkında bir sorum var. Anladığım kadarıyla, bir fonksiyondaki ilk dört argüman, Windows'da rcx, rdx, r8 ve r9 kayıtlarına (ve floatlar için xmm0-xmm3) geçiyor. Yani dört parametre olur ile önemsiz bir ekleme fonksiyonu şuna benzer: AncakDört argümandan daha az işlevler için yığın alanı ayırıyor mu?
add:
mov r10, rcx
add r10, rdx
add r10, r8
add r10, r9
mov rax, r10
ret
, ben documentation that mentions this rastladım: En azından
, her fonksiyon 32 bayt ayırmak gerekir (dört 64- yığındaki bit değerleri). Bu alan, yazmaçların iyi bilinen bir yığın konumuna kolayca kopyalanabilmesi için işleve geçirilmesini sağlar. Callee işlevi, giriş registerı param'lerini yığına dökmek için gerekli değildir, ancak yığın alanı rezervasyonu gerektiğinde bunu sağlar.
Yani, yapıyorum işlevler dört parametre veya daha az almak bile ben yığın yer ayırtmak gerekiyor, ya da sadece bir öneridir?
http://www.agner.org/: Örneğin GetAsyncKeyState ilk iki talimatlar parametreler için kullanmak Aranan için rezerve zannediyorsunuz 0x20 bayt alanında dönüş değeri yukarıda yığını üzerine optimize et/optimizing_assembly.pdf bölüm 4'te * her zaman * yer ayırmanız gerektiğini belirten bir örnek var. – user786653
Lanet, düzenlemek için çok geç. [oldnewthing] (http://blogs.msdn.com/b/oldnewthing/archive/2004/01/14/58579.aspx) amd64 arama kuralı üzerine blog girişi. – user786653
Sizin için yapbozun bir başka parçası: bir *** yaprak işleviniz var ***, yani başka işlevler çağırmıyor. – jww