ईएसआई और ईडीआई रजिस्टर का उद्देश्य?


119

कोडांतरक में EDI और ESI रजिस्टर का वास्तविक उद्देश्य और उपयोग क्या है?

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

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


9
इसे देखें: swansontec.com/sregisters.html
Jeffpowrs

जवाबों:


77

कुछ ऑपरेशन हैं जो आप केवल DI / SI (या उनके विस्तारित समकक्षों के साथ कर सकते हैं , यदि आपने 1985 में ASM नहीं सीखा था)। इनमें से हैं

REP STOSB
REP MOVSB
REP SCASB

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

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

यह उन लोगों के लिए सबसे अधिक है।


7
अतीत से अनुकूलन युक्ति: प्रतिनिधि stosw की तुलना में बहुत तेजी से होता है प्रतिनिधि stosb , आपको बस इतना करना, उपयोग कि कोशिश कर रहे हैं क्या के साथ दो और दो बाइट्स फिट को कॉपी इसलिए यदि बजाय अपने हाथ-अनुकूलित 16-बिट x86 विधानसभा कोड में ...
अलेक्जेंडर

88

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

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

movsb  es:di, ds:si

SI और DI का उपयोग सामान्य प्रयोजन सूचकांक रजिस्टर के रूप में भी किया जा सकता है। उदाहरण के लिए, 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+12शामिल है argv, ebxहै jऔर ediहै srcidx। तीसरा निर्देश edi4 से mulitplied का उपयोग करता है और ebp0x54 (के स्थान srcp) द्वारा ऑफसेट कहते हैं नोटिस ; पते के चारों ओर कोष्ठक अप्रत्यक्ष होने का संकेत देते हैं।


यद्यपि मुझे याद नहीं है कि मैंने इसे कहाँ देखा था, लेकिन यह इसकी पुष्टि करता है, और यह (स्लाइड 17) अन्य:

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

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


37

MOVSB ​​और MOVSW जैसे ऑपकोड जो कुशलता से मेमोरी से डेटा कॉपी करते हैं, उन्हें ESI द्वारा बताई गई मेमोरी से EDI द्वारा इंगित किया जाता है। इस प्रकार,

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

12

अन्य जवाबों में वर्णित स्ट्रिंग ऑपरेशन्स (MOVS / INS / STOS / CMAS / SCASB / W / D / Q आदि) के अलावा, मैं यह जोड़ना चाहता था कि इसमें और भी "आधुनिक" x86 असेंबली निर्देश हैं, जिनका उपयोग करना है। कम से कम EDI / RDI:

SSE2 MASKMOVDQU(और आगामी AVX VMASKMOVDQU) निर्देश चयनात्मक रूप से एक XMM रजिस्टर से मेमोरी को EDI / RDI द्वारा इंगित की गई बाइट्स लिखते हैं।


6

सामूहिक संचालन के लिए उपयोग किए जा रहे रजिस्टरों के अलावा, वे 32-बिट कॉलिंग कन्वेंशन में एक फ़ंक्शन कॉल (कॉल-संरक्षित) के माध्यम से संरक्षित होने की अपनी संपत्ति के लिए उपयोगी हैं। ESI, EDI, EBX, EBP, ESP कॉल-संरक्षित हैं जबकि EAX, ECX और EDX कॉल-संरक्षित नहीं हैं। कॉल-संरक्षित रजिस्टरों को सी लाइब्रेरी फ़ंक्शन द्वारा सम्मानित किया जाता है और सी लाइब्रेरी फ़ंक्शन कॉल के माध्यम से उनके मूल्य बने रहते हैं।

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

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

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

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


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

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

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

मुझे कॉल-संरक्षित पसंद है। मैंने उसी के साथ उत्तर को अपडेट किया है। समीक्षा के लिए धन्यवाद।
जे राजपूत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.