2010-07-28 7 views
5

मुझे पता है कि x86 एएसएम में परमाणु रूप से मूल्य कैसे लिखना है। लेकिन मैं एक कैसे पढ़ूं? LOCK उपसर्ग का उपयोग mov के साथ नहीं किया जा सकता है।मैं x86 एएसएम में परमाणु रूप से एक मूल्य कैसे पढ़ूं?

एक मूल्य बढ़ाने के लिए, मैं कर रहा हूँ:

lock inc dword ptr Counter 

कैसे मैं एक धागा सुरक्षित तरीके से काउंटर पढ़ा करते हैं?

उत्तर

4

मैं एक असेंबली विशेषज्ञ नहीं हूं, लेकिन शब्द-आकार (x86, 32-बिट पर) पढ़ता/लिखता है परमाणु पहले से ही होना चाहिए।

वृद्धि को लॉक करने की आवश्यकता आपको कारण है क्योंकि यह एक पढ़ा और लिखना है।

+0

मुझे लगता है कि आप सही हैं। यह समझ आता है। धन्यवाद। – IamIC

+0

अगर यह आपकी मदद करता है तो उत्तर स्वीकार करना न भूलें;) –

+4

हमेशा नहीं! यदि स्मृति पता कैश में है जो मल्टी सीपीयू इकाई में दूसरे सीपीयू का उपयोग करता है तो पढ़ने परमाणु होने की गारंटी नहीं है। तो "LOCK CMPXCHG EAX, [var]" का उपयोग करें जो पहली बाड़ मेमोरी कैश है। –

1

एक साधारण पढ़ने के लिए, यह ज्यादातर संरेखण के बारे में है। परमाणु पढ़ने को आश्वस्त करने का सबसे आसान तरीका हमेशा "प्राकृतिक" संरेखण का उपयोग करना है - यानी, संरेखण आइटम के आकार के रूप में कम से कम उतना ही बड़ा है (उदाहरण के लिए, 32-बिट आइटम 32-बिट गठबंधन है)।

गलत हस्ताक्षर पढ़ना जरूरी नहीं है परमाणु। एक चरम उदाहरण के लिए, एक विषम पते पर 32-बिट मान पढ़ने पर विचार करें जहां पहला बाइट एक कैश लाइन में है, और अन्य तीन बाइट एक और कैश लाइन में हैं। ऐसे मामले में, परमाणु पढ़ने अनिवार्य रूप से असंभव है।

चूंकि (कम से कम अधिकांश) प्रोसेसर 64-बिट चौड़ी मेमोरी बस का उपयोग करते हैं, सबसे बड़ी वस्तु जो परमाणु रूप से पढ़ने की उम्मीद कर सकती है 64 बिट्स है।

5

जैसा कि मैंने this पोस्ट में आप को समझाने:

संचित करने योग्य स्मृति है कि बस की चौड़ाई, कैश लाइनों, और पेज सीमाओं की गारंटी नहीं है इंटेल कोर 2 द्वारा परमाणु होने की भर विभाजित कर रहे हैं करने के लिए ऐक्सेस डुओ, इंटेल कोर डुओ, पेंटियम एम, पेंटियम 4, इंटेल ज़ीऑन, पी 6 परिवार, पेंटियम, और इंटेल 486 प्रोसेसर। इंटेल कोर 2 डुओ , इंटेल कोर डुओ, पेंटियम एम, पेंटियम 4, इंटेल जिऑन, और पी 6 परिवार प्रोसेसर बस नियंत्रण संकेत कि बाहरी मेमोरी उप की अनुमति बनाने के लिए प्रदान करते हैं विभाजन परमाणु तक पहुँचता है; हालांकि, गैर-हस्ताक्षरित डेटा एक्सेस प्रोसेसर के प्रदर्शन को गंभीरता से प्रभावित करेगा और इससे बचा जाना चाहिए।

तो का उपयोग करें:

LOCK  CMPXCHG EAX, [J] 

लॉक CMPXCHG पहले बाड़ कैश स्मृति और से गंतव्य मूल्य के साथ EAX तुलना, अगर गंतव्य मूल्य equ नहीं तो EAX में परिणाम गंतव्य मूल्य है।

संपादित करें: लिंक करती है:

Intel® 64 and IA-32 Architectures Software Developer’s Manuals

में Volume 3A: System Programming Guide जांच खंड 8.1.1

यह भी जांच: Optimization Reference Manual section: CHAPTER 7 OPTIMIZING CACHE USAGE

+0

यह संकलित नहीं होगा क्योंकि [जे] एक स्मृति सूचक है। यह एक रजिस्टर मूल्य होना चाहिए। यह कैच -22 है जो मैं चारों ओर नहीं जा सकता। – IamIC

+1

मैं आपकी दूसरी पोस्ट से देखता हूं कि यह वास्तव में एक मुद्दा नहीं है जब तक कि मूल्य गठबंधन हो और सीपीयू की बस चौड़ाई के साथ। – IamIC

+0

@IAMIC: बस चौड़ाई नहीं, बिल्कुल। इंटेल और एएमडी की गारंटी में सबसे कम आम संप्रदाय यह है कि 'mov' load/store परमाणु है [यदि यह 8-बाइट सीमा (कैश किए गए एक्सेस के लिए) पार नहीं करता है।] (Https://stackoverflow.com/a/36685056/224132) या बिना छेड़छाड़ के लिए, अगर यह गठबंधन है या 16-बिट पहुंच है जो एक डवर्ड सीमा पार नहीं करती है। इसके अलावा '[जे]' एक पूर्ण या (x86-64 में) एक आरआईपी-रिश्तेदार एड्रेसिंग मोड है। यह डबल-इंडिकेशन नहीं है। यह सिर्फ ठीक है। एमएएसएम वाक्यविन्यास अक्सर '[] 'को छोड़ देता है, लेकिन वे एमएएसएम में वैकल्पिक हैं और NASM में आवश्यक हैं। –

1

यह अन्य उत्तरों को पढ़ने के लिए दिलचस्प है। मुझे लगता है कि @ जीजे शायद पैसे पर है।

कई सालों से यह हमेशा सच था कि 32-बिट पढ़ने और लिखने परमाणु था। यह हाल ही के वर्षों में वास्तव में आक्रामक कैशिंग के साथ है कि अब इसकी गारंटी नहीं है।

मुझे लगता है कि यही कारण है कि मैं सी ++, जावा या कुछ और मेरे बीच मशीन कोड पसंद करता हूं। इन दिनों मशीन कोड भरोसेमंद लिखने के लिए बहुत जटिल है (जब तक आप इसे अपने कौशल को तेज रखने के लिए बहुत करते हैं)। सौभाग्य से, आज के अनुकूल कंप्यूटर्स इतने अच्छे हैं कि आपको शायद ही कभी हाथ से अनुकूलित असेंबलर के प्रदर्शन की आवश्यकता होती है।

+0

सी ++ सीपीयू के ऊपर मेमोरी सेमेन्टिक्स के बारे में कुछ भी गारंटी नहीं देगा, न ही जावा बिना अस्थिर होगा। –

+0

सी ++ परमाणु प्रकार (सी ++ 11 सामान) के लिए परमाणु पहुंच की गारंटी दे सकता है, जैसा कि सी (सी 11) करता है। –