volatile
या नहीं, केवल तकनीकी कारण है कि EAX
विंडोज पर एक समारोह कॉल करने से पहले सीधे प्रारंभ करना होगा थे कि function
__syscall
घोषित किया जाता है, यानी विंडोज CS_SYSCALL बुला परंपरा का उपयोग करके। संकल्पनात्मक रूप से, यह संयुक्त राष्ट्र * एक्स x86_64 सम्मेलन के समान ही है जहां %al
में %xmm
रजिस्टरों में उत्तीर्ण फ्लोटिंग पॉइंट प्रकार तर्कों की संख्या शामिल है।
syscall विंडोज पर सम्मेलन बुला __cdecl
के समान है, उलटे क्रम में स्टैक पर अर्थात समारोह आर्ग है, लेकिन इसके अलावा कि AL
तर्क की संख्या की गणना शामिल हो के साथ; ऐसा इसलिए किया जाता है कि कर्नेल कोड जो आमतौर पर इसके अंतिम छोर पर होता है जानता है कि तर्क से पुनर्प्राप्त करने के लिए उपयोगकर्ता स्टैक पर कर्नेल स्टैक पर कितना डेटा पढ़ना है।
EAX
32 बिट विंडोज़ पर सभी कॉलिंग सम्मेलनों के लिए एक स्क्रैच रजिस्टर है, इसका मूल्य कभी भी कॉल कॉल पर संरक्षित नहीं होता है, कॉल करने से पहले इसे सीधे शुरू करना अनावश्यक होता है। भले ही यह वैरिएबल volatile
था - क्योंकि एक साधारण पुनः लोड एक स्मृति बाधा नहीं है और पिछले स्टोर को "प्रतिबद्ध" नहीं करता है। इसके अलावा, [EBP - 4]
स्टैक के भीतर है, इसलिए चर स्थानीय (और volatile
क्वालीफायर कम समझ में आता है)।
यदि यह एक चूक अनुकूलन नहीं है तो यह
__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);
}
यह क़यास आपके जैसे विधानसभा उत्पादन बना सकता है तर्क, जैसे की विभिन्न संख्या, परिकल्पित रूप के साथ एक __syscall function(...)
की एक मंगलाचरण हो सकता है,।
स्रोत
2012-01-25 12:56:28
मैंने देखा है कि कंपाइलर्स इस से डंबर चीजें करते हैं ... – Mysticial
@ मिस्टिकियल: ओह लॉल ... यह पहली बार है जब मैंने ऐसा कुछ देखा है। :) जानकार अच्छा लगा। – Mehrdad
शायद पहले पुश में एक शाखा है। –