volatile
ya da olmasın, EAX
Windows üzerinde bir işlev çağrısı yapmadan önce doğrudan başlatılması için olurdu neden sadece teknik nedeni idi. Kavramsal olarak, bu, %al
'un %xmm
kayıt defterinde geçirilen kayan nokta türü arşivi içerdiği UN * X x86_64 sözleşmesine biraz benzer.
Windows'ta sistem çağrısı çağrı kuralı __cdecl
ile aynıdır, yani yığın üzerinde ters sırada işlevler, ancak ek olarak AL
argüman sayısını içerir; Bu, genellikle bunun son ucunda bulunan çekirdek kodunun, arjları geri almak için kullanıcı yığınından çekirdek yığınına ne kadar veri okunacağını bilmesi için yapılır.
EAX
, 32bit Windows'daki tüm çağrı kuralları için bir not defteridür, değeri hiçbir zaman arama yapmadan önce işlev çağrıları üzerinden korunmaz, bir çağrı yapmadan önce doğrudan başlatılır. Sahip olduğu değişken volatile
olsa bile - basit bir yeniden yükleme bellek bariyeri değildir ve önceki bir depoyu "taahhüt etmez". Ayrıca, [EBP - 4]
konumu yığınının içinde yer aldığından, değişken yerel (ve volatile
niteleyicinin çok az anlam ifade etmemektedir). Bir cevapsız optimizasyon değilse
o zaman
__syscall printf_syscall_conv(char *fmt, ...);
void possibly_print_three_vals(char *fmt, int val1, int val2, int val3)
{
if (*strchr('%', fmt) == '\0') // if no "%" in fmt, pass no args
printf_syscall_conv(fmt);
else
printf_syscall_conv(fmt, val1, val2, val3);
}
Bu programlar sayesinde sizin gibi montaj çıktı yaratabilecek, varsayımsal argümanlar gibi farklı sayıdaki ile __syscall function(...)
bir çağırma olabilir.
Derleyicileri, bundan daha fazla bir şey yaptıklarını gördüm ... – Mysticial
@Mysticial: Oh lol ... ilk defa böyle bir şey fark ettim. :) İyi bilmek. – Mehrdad
Belki de ilk basamağa bir dal var. –