मैं विभिन्न setjmp
और longjmp
कार्यान्वयन के स्रोत के माध्यम से ब्राउज़ कर रहा था और ध्यान दिया कि सभी CPU रजिस्ट्रार jmp_buf
संरचना में सहेजे नहीं गए हैं। एएमडी 64 एबीआई की समीक्षा करने के बाद, मैंने देखा कि केवल कैली-सहेजे गए रजिस्टरों को ही सहेजा जाता है।setjmp (3) AMD64 पर सभी रजिस्टरों को क्यों नहीं बचाता है?
मुझे समझ में नहीं आता कि केवल कुछ रजिस्टरों को सहेजा गया है जब फ़ंक्शन स्थिति पूरी तरह से फिर से शुरू की जा सकती है। निश्चित रूप से जब तक मैं longjmp
पर कॉल नहीं करता तब तक सहेजे गए रजिस्टरों को कई बार बार-बार गिरफ्तार किया जाना चाहिए था?
सब कुछ पूरी तरह से काम करता है, इसलिए निश्चित रूप से कुछ ऐसा है जो मुझे समझ में नहीं आता है। मैं उम्मीद कर रहा था कि कोई इस पर कुछ प्रकाश डाल सकता है।
धन्यवाद!
setjmp के कार्यान्वयन हैं जो केवल निर्देश सूचक/फ्रेम सूचक को सहेजते हैं ('libunwind' देखें)। जिनके पास बहुत तेजी से सेटजंप है लेकिन अपेक्षाकृत धीमी लम्बी समय है और फ्रेम टेबल पर आधारित हैं जो वर्णन करते हैं कि अन्य रजिस्टरों को कॉलर से सहेजे गए स्थानों से कैसे पुनर्प्राप्त किया जाए। –
मुझे वह स्रोत कहां मिल सकता है जिसे आप देख रहे थे? – nullpotent
@AljoshaBre ये अब तक के सबसे अधिक पढ़ने योग्य हैं: [setjmp] (http://git.etalabs.net/cgi-bin/gitweb.cgi?p=musl;a=blob;f=src/setjmp /x86_64/setjmp.s;h=98f58b8d6551e391f426fc53c81678a03ac89074;hb=HEAD) और [longjmp] (http://git.etalabs.net/cgi-bin/gitweb.cgi?p=musl;a=blob;f=src/ setjmp/x86_64/longjmp.s; एच = e175a4b9606bba41eccc8972c22244e533718f0a; एचबी = HEAD)। – haste