2011-08-21 17 views
7

Windows'da x64 montajını 'eğlence' için öğreniyorum. MSDN documentation for the x64 calling convention on Windows diyor ki:Win64 ABI'de, genel amaçlı depolama için ayrılmış bağımsız değişken yığını kullanılabilir mi?

arayan aranan uca parametreler için alan tahsis sorumludur ve her zaman Aranan birçok parametreye sahip olmasa bile, 4 kayıt parametreleri için yeterli alan ayırmak gerekir. Bu, C unprototyped işlevlerin desteklenmesi ve C/C++ işlevlerinin vararg'ının basitleştirilmesine yardımcı olur. Benim fonksiyonları C/C++ fonksiyonlar C unprototyped fonksiyonlar olmayan veya varargs gibi

, hep işlev içinde genel amaçlı depolama için (sağ bir çağrıdan sonra rsp değiştirilmemiş bir değer varsayarak) [rsp+32] için [rsp+8] kullanabilirsiniz bu ne anlama geliyor Yerel değişkenler gibi mi?

cevap

6

Evet, herhangi bir amaç için gelen parametre çizme alanını kullanabilirsiniz. Fakat bunu zaten biliyordunuz: Bunu yapma izni, gelen parametrelerin değiştirilmesinin yasallığı tarafından zaten ima edilmektedir.

void somefunction(int arg1) 
{ 
    arg1 = anyvalue; // mov [rsp+8], anyvalue 
} 
+0

Teşekkür karışık eski okul döküm için üzgünüm. Bununla birlikte, gelen parametrelerin değiştirilmesi, argümanın "rcx" ile aktarılmasından ziyade "rv rcx, anyvalue" olacaktır, bu yüzden [rsp + 8] 'den emin değildim. – Trillian

+3

Ancak, gelen parametrelere de izin verebilirsiniz. Her şeyden önce ayrılmış alan var. void somefunction (int arg1) {/ * dökülme: mov [rsp + 8], rcx */arg1 = herhangi bir değer;/* mov [rsp + 8], herhangi bir değer * /} ' –

1

ben ne yapması çalışıyor Bunun gibi daha bir şey olduğunu düşünüyorum: Bildiğim kadarıyla anladığım kadarıyla

*(decltype(&anyvalue))((PBYTE)&arg1+8) = anyvalue; // mov [rsp+8+8], anyvalue 

, Microsoft, dört depolamak için Aranan için yeterli alan ayırmak için gerekli olduğunu belirtmektedir (rcx, rdx, r8. r9), sadece bir argüman alan bir fonksiyonda (rcx) kaydeder.

Not: i çirkin c kodu ve yeni decltype anahtar kelime ile cevap vermek için henüz

İlgili konular