कोडांतरक में EDI और ESI रजिस्टर का वास्तविक उद्देश्य और उपयोग क्या है?
मुझे पता है कि वे एक चीज के लिए स्ट्रिंग ऑपरेशन के लिए उपयोग किए जाते हैं।
क्या कोई उदाहरण भी दे सकता है?
कोडांतरक में EDI और ESI रजिस्टर का वास्तविक उद्देश्य और उपयोग क्या है?
मुझे पता है कि वे एक चीज के लिए स्ट्रिंग ऑपरेशन के लिए उपयोग किए जाते हैं।
क्या कोई उदाहरण भी दे सकता है?
जवाबों:
कुछ ऑपरेशन हैं जो आप केवल DI / SI (या उनके विस्तारित समकक्षों के साथ कर सकते हैं , यदि आपने 1985 में ASM नहीं सीखा था)। इनमें से हैं
REP STOSB
REP MOVSB
REP SCASB
जो क्रमशः, दोहराया (= द्रव्यमान) भंडारण, लोडिंग और स्कैनिंग के लिए संचालन हैं। आप क्या करते हैं आप एक या दोनों ऑपरेंड को इंगित करने के लिए SI और / या DI सेट करते हैं, शायद CX में एक गिनती डालते हैं और फिर 'er rip' करते हैं। ये ऐसे ऑपरेशन हैं जो एक बार में बाइट्स के एक गुच्छा पर काम करते हैं, और वे सीपीयू को स्वचालित में डालते हैं। क्योंकि आप स्पष्ट रूप से लूप कोडिंग नहीं कर रहे हैं, वे हाथ से कोडित लूप की तुलना में अपनी बात अधिक कुशलता से (आमतौर पर) करते हैं।
बस अगर आप सोच रहे हैं: आप ऑपरेशन कैसे सेट करते हैं, इस पर निर्भर करते हुए, बार-बार भंडारण कुछ सरल हो सकता है जैसे मान 0 को स्मृति के एक बड़े सन्निहित ब्लॉक में छिद्रित करना; MOVSB का उपयोग किया जाता है, मुझे लगता है, एक बफर (अच्छी तरह से, बाइट्स के किसी भी गुच्छा) से दूसरे में डेटा कॉपी करने के लिए; और SCASB का उपयोग बाइट की तलाश के लिए किया जाता है जो कुछ खोज मानदंड से मेल खाता है (मुझे यकीन नहीं है कि यह केवल समानता पर खोज कर रहा है, या क्या - आप इसे देख सकते हैं :))
यह उन लोगों के लिए सबसे अधिक है।
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
। तीसरा निर्देश edi
4 से mulitplied का उपयोग करता है और ebp
0x54 (के स्थान srcp
) द्वारा ऑफसेट कहते हैं नोटिस ; पते के चारों ओर कोष्ठक अप्रत्यक्ष होने का संकेत देते हैं।
AX
= संचायक
DX
= डबल शब्द संचायक
CX
= काउंटर
BX
= आधार रजिस्टर
वे सामान्य उद्देश्य रजिस्टर की तरह दिखते हैं, लेकिन कई निर्देश हैं जो (अप्रत्याशित रूप से?) उनमें से एक का उपयोग करते हैं - लेकिन कौन सा? - स्पष्ट रूप से।
MOVSB और MOVSW जैसे ऑपकोड जो कुशलता से मेमोरी से डेटा कॉपी करते हैं, उन्हें ESI द्वारा बताई गई मेमोरी से EDI द्वारा इंगित किया जाता है। इस प्रकार,
mov esi, source_address
mov edi, destination_address
mov ecx, byte_count
cld
rep movsb ; fast!
अन्य जवाबों में वर्णित स्ट्रिंग ऑपरेशन्स (MOVS / INS / STOS / CMAS / SCASB / W / D / Q आदि) के अलावा, मैं यह जोड़ना चाहता था कि इसमें और भी "आधुनिक" x86 असेंबली निर्देश हैं, जिनका उपयोग करना है। कम से कम EDI / RDI:
SSE2 MASKMOVDQU
(और आगामी AVX VMASKMOVDQU
) निर्देश चयनात्मक रूप से एक XMM रजिस्टर से मेमोरी को EDI / RDI द्वारा इंगित की गई बाइट्स लिखते हैं।
सामूहिक संचालन के लिए उपयोग किए जा रहे रजिस्टरों के अलावा, वे 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-बिट कॉलिंग सम्मेलनों से अलग हैं, और मुझे यकीन नहीं है कि ये रजिस्टर कॉल-संरक्षित हैं या नहीं।