2012-03-23 11 views
11

मैं अपने खाली समय में असेंबली भाषा सीख रहा हूं। क्या कोई इस बात को समझा सकता है कि इस कार्यक्रम में मैक्सस्टैक क्यों वैकल्पिक है। मैं यानी कार्यक्रम संकलन और चलाने के साथ .Maxstack बाहर टिप्पणी की होगी जवाब ऑनलाइन और ऐसी कोई भाग्य के साथ मेरी किताब में मिल करने की कोशिश की:एमएसआईएल कोड में .MaxStack निर्देश वैकल्पिक क्यों है?

//Add.il 
//Add Two Numbers 

.assembly extern mscorlib {} 

.assembly Add 
{ 
    .ver 1:0:1:0 
} 
.module add.exe 

.method static void main() cil managed 
{ 
    //.maxstack 2 
    .entrypoint 

    ldstr "The sum of 50 and 30 is = " 
    call void [mscorlib]System.Console::Write (string) 

    ldc.i4.s 50 
    ldc.i4 30  
    add 
    call void [mscorlib]System.Console::Write (int32) 
    ret 
} 

मैं कमांड लाइन पर कार्यक्रम संकलन कर रहा हूँ ILASM उपकरण का उपयोग कर और फिर उत्पन्न निष्पादन योग्य चल रहा है।

उत्तर

12

मुझे लगता है कि आपका भ्रम वास्तव में .maxstack की गलतफहमी से उत्पन्न होता है। इसे बनाना एक आसान गलती है, क्योंकि ऐसा लगता है कि इसे निष्पादित करते समय त्रुटि उत्पन्न होगी। हैरानी की बात है कि, उस विशेष निर्देश में वास्तव में रनटाइम पर स्टैक आकार के साथ कुछ भी नहीं करता है, इसके बजाय, यह विशेष रूप से कोड सत्यापन के दौरान उपयोग किया जाता है।

विभाजन III से - धारा 1.7.4

नोट: Maxstack कार्यक्रम के विश्लेषण से संबंधित है, कार्यावधि में ढेर के आकार के लिए नहीं। यह स्टैक फ्रेम के बाइट्स में अधिकतम आकार निर्दिष्ट नहीं करता है, बल्कि उन वस्तुओं की संख्या जिन्हें विश्लेषण टूल द्वारा ट्रैक किया जाना चाहिए।

कोड अविश्वसनीय बन जाता है। वही खंड, नोट करता है कि किसी भी अनुरूप कार्यान्वयन को अमान्य अधिकतम स्टैक मान वाले किसी विधि का समर्थन करने की आवश्यकता नहीं है। हालांकि, यह नहीं कहता कि यह नहीं होना चाहिए, और स्पष्ट रूप से, रनटाइम कोड निष्पादित कर रहा है। तो अगर ऐसा कोई प्रभाव नहीं पड़ता है, तो इसे परेशान क्यों करें?

मानो या न मानो, डिफ़ॉल्ट द्वारा, .NET Framework रूप से संदिग्ध कोड चलाता है। यह वास्तव में मुश्किल था मुझे कैसे .NET 4.0 में सत्यापन को सक्षम करने के लिए यह पता लगाने की, लेकिन अगर आप कैस को चालू करते हैं, (.maxstack 1 साथ) अपने कार्यक्रम के साथ

बिना क्रिया के अपवाद चलना बंद हो जाएंगे: System.InvalidProgramException: आम भाषा रनटाइम एक अवैध प्रोग्राम का पता चला। मुख्य पर()

इसे ध्यान में रखते हुए, संदिग्ध कोड किसी भी वातावरण है कि पूर्ण विश्वास (आम तौर पर इंटरनेट से विधानसभाओं) नहीं है में नहीं चल सकता। यदि यह आपके लिए महत्वपूर्ण नहीं है, तो आप इसे एक अवैध मान दे सकते हैं, और यह वास्तव में कोई फर्क नहीं पड़ता। यदि कोड स्वयं अभी भी सही है, तो यह ठीक होगा; निश्चित रूप से यदि आईएल स्टैक के साथ वास्तव में कोई समस्या है, तो यह InvalidProgramException फेंक देगा।

0

यदि मुझे सही याद है, तो डिफ़ॉल्ट स्टैक आकार 8 है यदि कथन छोड़ा गया है।

+1

यही वह है जो मैंने पहले सोचा था, लेकिन अगर मैं उपरोक्त प्रोग्राम में .maxstack सेट करता हूं तो प्रोग्राम अभी भी चलता है। प्रोग्राम के लिए यह 2 या उससे ऊपर होना चाहिए जो मैं देख सकता हूं। – w0051977

+0

बस अनुमान लगा रहा है, लेकिन शायद आईएलएएसएम यह समझने के लिए पर्याप्त चालाक है कि 1 पर्याप्त नहीं होगा और सेटिंग को ओवरराइड करेगा। –

+2

@ 500-आंतरिक सर्वर सर्वर, यह नहीं है। आईएलडीएएसएम के अनुसार, उत्सर्जित कोड में वास्तव में '.axaxack 1' होता है। और विनिर्देश के अनुसार, इस तरह का कोड अमान्य और अविश्वसनीय होना चाहिए। और PEVerify वास्तव में असेंबली के सत्यापन में विफल रहता है। लेकिन यह वैसे भी ठीक चलाता है। – svick

संबंधित मुद्दे