2009-12-06 8 views
90

ईडीआई & असेंबलर में ईएसआई रजिस्ट्रार का वास्तविक उद्देश्य और उपयोग क्या है?ईएसआई और ईडीआई रजिस्ट्रार का उद्देश्य?

मुझे पता है कि वे एक चीज के लिए स्ट्रिंग ऑपरेशंस के लिए उपयोग किए जाते हैं।

क्या कोई भी उदाहरण दे सकता है?

+6

इसे देखें: http://www.swansontec.com/sregisters.html – Jeffpowrs

उत्तर

62

कुछ ऑपरेशन हैं जो आप केवल डीआई/एसआई (या उनके विस्तारित समकक्षों के साथ करते हैं, यदि आपने 1 9 85 में एएसएम नहीं सीखा था) के साथ करते हैं। इनमें

REP STOSB 
REP MOVSB 
REP SCASB 

हैं कौन हैं, क्रमशः, के संचालन के लिए बार-बार (= मास) के भंडारण, लदान और स्कैनिंग। आप क्या करते हैं, आप एक या दोनों ऑपरेटरों को इंगित करने के लिए एसआई और/या डी सेट करते हैं, शायद सीएक्स में गिनती डालते हैं और फिर 'एआर रिप' देते हैं। ये वे ऑपरेशन हैं जो एक समय में बाइट्स के गुच्छा पर काम करते हैं, और वे सीपीयू को स्वचालित रूप से डाल देते हैं। चूंकि आप स्पष्ट रूप से लूप कोडिंग नहीं कर रहे हैं, इसलिए वे हाथ से कोडित लूप की तुलना में अपनी बात अधिक कुशलतापूर्वक (आमतौर पर) करते हैं।

बस अगर आप सोच रहे हैं: आप ऑपरेशन को कैसे सेट अप करते हैं, इस पर निर्भर करता है कि दोहराया भंडारण स्मृति 0 के बड़े संगत ब्लॉक में मूल्य 0 को छिद्रित करना आसान हो सकता है; एमओवीएसबी का उपयोग किया जाता है, मुझे लगता है कि, एक बफर से डेटा कॉपी करने के लिए (अच्छी तरह से, बाइट्स का कोई गुच्छा) दूसरे में; और एससीएएसबी का उपयोग एक बाइट को देखने के लिए किया जाता है जो कुछ खोज मानदंड से मेल खाता है (मुझे यकीन नहीं है कि यह केवल समानता पर खोज रहा है, या – आप इसे देख सकते हैं :))

यह उन अधिकांश नियमों के लिए है ।

+5

अतीत से ऑप्टिमाइज़ेशन टिप: * rep stosw * * rep stosb * से बहुत तेज है, इसलिए यदि दो और दो बाइट्स की प्रतिलिपि बनाते हैं आप जो करने की कोशिश कर रहे हैं, उसके बजाय अपने हाथ-अनुकूलित 16-बिट x86 असेंबली कोड में उपयोग करें ... – Alexander

27

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

mov esi, source_address 
mov edi, destination_address 
mov ecx, byte_count 
cld 
rep movsb ; fast! 
10

स्ट्रिंग आपरेशन के अतिरिक्त (MOVs/आईएनएस/STOS/CMPS/SCASB/डब्ल्यू/डी/क्यू आदि) अन्य उत्तर में उल्लेख किया है, मैं जोड़ने के लिए देखते हैं कि चाहता था भी अधिक " आधुनिक "86 विधानसभा निर्देश है कि परोक्ष कम से कम ईडीआई/RDI का उपयोग करें:

SSE2 MASKMOVDQU (और आगामी AVX VMASKMOVDQU) अनुदेश चुनिंदा याद करने के लिए XMM रजिस्टर से बाइट्स लिख ईडीआई/RDI द्वारा की ओर इशारा किया।

63

SI = स्रोत सूचकांक
DI = गंतव्य सूचकांक

के रूप में दूसरों को संकेत दिया है, वे स्ट्रिंग निर्देश के साथ विशेष उपयोगों के लिए है। वास्तविक मोड प्रोग्रामिंग के लिए, ES खंड रजिस्टर

movsb es:di, ds:si 

एसआई और डि भी सामान्य प्रयोजन सूचकांक रजिस्टरों के रूप में इस्तेमाल किया जा सकता के रूप में DI और DSSI साथ साथ इस्तेमाल किया जाना चाहिए। उदाहरण के लिए, C स्रोत कोड

srcp [srcidx++] = argv [j]; 

8B550C   mov edx,[ebp+0C] 
8B0C9A   mov ecx,[edx+4*ebx] 
894CBDAC  mov [ebp+4*edi-54],ecx 
47    inc edi 

में संकलित जहां ebp+12argv होता है, ebxj है, और edisrcidx है।ध्यान दें कि तीसरे निर्देश edi 4 द्वारा mulitplied का उपयोग करता है और 0x0x54 द्वारा ऑफसेट (srcp का स्थान) जोड़ता है; पते के चारों ओर ब्रैकेट संकेत इंगित करता है।


हालांकि मैं याद नहीं कर सकते, जहां मैं इसे देखा है, लेकिन this इसमें से अधिकांश की पुष्टि करता है, और this (स्लाइड 17) दूसरों:

AX = संचायक
DX = डबल शब्द संचायक
CX = काउंटर
BX = बेस रजिस्टर

वे सामान्य प्रयोजन रजिस्टर की तरह दिखते हैं, लेकिन वहां कई संख्याएं हैं I nstructions जो (अप्रत्याशित रूप से?) उनमें से एक का उपयोग करें- लेकिन कौन सा? - स्पष्ट रूप से।

3

बड़े पैमाने पर संचालन के लिए उपयोग किए जाने वाले रजिस्टरों के अतिरिक्त, वे 32-बिट कॉलिंग सम्मेलन में फ़ंक्शन कॉल (कॉल-संरक्षित) के माध्यम से संरक्षित होने की अपनी संपत्ति के लिए उपयोगी हैं। ईएसआई, ईडीआई, ईबीएक्स, ईबीपी, ईएसपी कॉल-संरक्षित हैं जबकि ईएक्स, ईसीएक्स और ईडीएक्स कॉल-संरक्षित नहीं हैं। कॉल-संरक्षित रजिस्टरों को सी लाइब्रेरी फ़ंक्शन द्वारा सम्मानित किया जाता है और उनके मान सी लाइब्रेरी फ़ंक्शन कॉल के माध्यम से बने रहते हैं।

जेफ डंटमैन अपनी असेंबली भाषा पुस्तक में कमांड लाइन तर्कों को मुद्रित करने के लिए एक उदाहरण असेंबली कोड है। कोड काउंटर स्टोर करने के लिए ईएसआई और ईडी का उपयोग करता है क्योंकि वे सी लाइब्रेरी फ़ंक्शन printf द्वारा अपरिवर्तित होंगे। ईएक्स, ईआरएक्स, एडीएक्स जैसे अन्य रजिस्टरों के लिए, सी पुस्तकालय कार्यों द्वारा उपयोग नहीं किए जाने की उनकी कोई गारंटी नहीं है।

https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025

देखें अनुभाग 12.8 सी कैसे देखता है कमान लाइन तर्क।

ध्यान दें कि 64-बिट कॉलिंग सम्मेलन 32-बिट कॉलिंग सम्मेलनों से अलग हैं, और मुझे यकीन नहीं है कि ये रजिस्ट्रार कॉल-संरक्षित हैं या नहीं।

+0

मैंने कभी "पवित्र" कभी नहीं सुना है कि अधिकांश लोग "अस्थिर"/"अस्थिर" , या "कॉलली-सेव" बनाम "कॉलर सेव किया गया" बनाम। मुझे "कॉल-संरक्षित"/"कॉल-क्लोबर्ड" पसंद है, क्योंकि इसका मतलब यह नहीं है कि वे वास्तव में कहीं भी सहेजे जाते हैं। वैसे भी, ईएसआई/आरएसआई और ईडीआई/आरडीआई x86-64 सिस्टम वी एबीआई में कॉल-संरक्षित नहीं हैं। –

+0

इसके अलावा, आप सामान्य 32-बिट कॉलिंग सम्मेलनों में कॉल-संरक्षित के रूप में ईबीपी और ईएसपी को सूचीबद्ध करना भूल गए। –

+1

वैसे भी, यह एक बहुत अच्छा मुद्दा है। वास्तविक कोड में, आप किसी भी निर्देश के लिए विशेष होने के कारण कॉलिंग-सम्मेलन कारणों के आधार पर कुछ के लिए ईडीआई/ईएसआई चुनने की अधिक संभावना रखते हैं। –

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