ইএসআই এবং ইডিআই রেজিস্টারগুলির উদ্দেশ্য?


119

এসিডাব্লায় ইডিআই এবং ইএসআই নিবন্ধগুলির আসল উদ্দেশ্য এবং ব্যবহার কী?

আমি জানি তারা একটি জিনিসের জন্য স্ট্রিং অপারেশনের জন্য ব্যবহৃত হয়।

কেউ কি উদাহরণ দিতে পারে?


উত্তর:


77

কয়েকটি অপারেশন রয়েছে যা আপনি কেবল ডিআই / এসআই দিয়ে করতে পারেন (বা তাদের বর্ধিত সহযোগীরা, যদি আপনি 1985 সালে এএসএম না শিখেন)। এর মধ্যে রয়েছে

REP STOSB
REP MOVSB
REP SCASB

যা যথাক্রমে পুনরাবৃত্তি (= ভর) সঞ্চয়, লোডিং এবং স্ক্যানিংয়ের জন্য অপারেশন। আপনি যা করেন তা হ'ল আপনি এসআই এবং / অথবা ডিআই সেটআপ করে এক বা উভয় অপারেশনগুলিকে নির্দেশ করতে, সম্ভবত সিক্সে একটি গণনা রেখে তারপরে 'এরপ' কেটে ফেলা যাক। এগুলি এমন ক্রিয়াকলাপ যা একবারে একগুচ্ছ বাইটগুলিতে কাজ করে এবং তারা সিপিইউকে স্বয়ংক্রিয়ভাবে রাখে। যেহেতু আপনি স্পষ্টভাবে লুপগুলি কোডিং করছেন না, তারা তাদের কাজটি হ্যান্ড কোডেড লুপের চেয়ে বেশি দক্ষতার সাথে (সাধারণত) করে।

আপনি যদি ভাবছেন: আপনি কীভাবে অপারেশনটি সেট আপ করেছেন তার উপর নির্ভর করে বারবার স্টোর করা সহজ 0 মুল্যটিকে 0 মেমরির একটি বৃহত সংলগ্ন ব্লকের মধ্যে ঘুষি দেওয়ার মতো হতে পারে; আমি মনে করি, এক বাফার থেকে ডেটা অনুলিপি করতে ভালভাবে এমওভিএসবি ব্যবহার করা হয়েছে (ভাল, কোনও গুচ্ছ বাইট) অন্যটিতে; এবং এসসিএএসবি এমন কিছু বাইট অনুসন্ধান করতে ব্যবহৃত হয় যা কিছু অনুসন্ধানের মানদণ্ডের সাথে মেলে (আমি নিশ্চিত নই যে এটি কেবল সাম্যের দিকে অনুসন্ধান করছে বা কী - আপনি এটি সন্ধান করতে পারেন :))

এই রেগগুলির জন্য বেশিরভাগই।


7
অতীত থেকে অপ্টিমাইজেশনের টিপ: রিপ্রেজ স্টোসব রেপ স্টোসবির তুলনায় অনেক দ্রুত , তাই যদি আপনি যা করার চেষ্টা করছেন তার সাথে দুটি এবং দুটি বাইট অনুলিপি ফিট করে, পরিবর্তে এটি আপনার হাতের-অপ্টিমাইজড 16-বিট x86 অ্যাসেম্বলি কোডটিতে ব্যবহার করুন ...
আলেকজান্ডার

88

SI = উত্স সূচক
DI = গন্তব্য সূচক

অন্যরা ইঙ্গিত হিসাবে, স্ট্রিং নির্দেশাবলী সঙ্গে তাদের বিশেষ ব্যবহার আছে। রিয়েল মোড প্রোগ্রামিং জন্য, ESসেগমেন্ট রেজিস্টার সঙ্গে ব্যবহার করা আবশ্যক DIএবং DSসঙ্গে SIহিসাবে

movsb  es:di, ds:si

এসআই এবং ডিআই সাধারণ উদ্দেশ্য সূচক রেজিস্টার হিসাবেও ব্যবহার করা যেতে পারে। উদাহরণস্বরূপ, 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 দ্বারা মলিটপ্লাইড ব্যবহার করে এবং 0x54 দ্বারা ebpঅফসেট যুক্ত করে (এর অবস্থান)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

অন্যান্য উত্তরে উল্লিখিত স্ট্রিং অপারেশনগুলি (এমওভিএস / আইএনএস / স্টোস / সিএমপিএস / এসসিএএসবি / ডাব্লু / ডি / কিউ ইত্যাদি) ছাড়াও, আমি যুক্ত করতে চেয়েছিলাম যে আরও "আধুনিক" এক্স ৮86 বিধানসভার নির্দেশাবলীও রয়েছে যা এখানে স্পষ্টভাবে ব্যবহার করা হয়েছে সর্বনিম্ন ইডিআই / আরডিআই:

SSE2 MASKMOVDQU(এবং আসন্ন AVXVMASKMOVDQU ) নির্দেশাবলী নির্বাচনীভাবে এক্সএমএম রেজিস্টার থেকে ইডিআই / আরডিআই দ্বারা চিহ্নিত স্মৃতিতে বাইটগুলি লিখুন।


6

গণ পরিচালনার জন্য নিবন্ধকগুলি ব্যবহার করা ছাড়াও, তারা 32-বিট কলিং কনভেনশনে একটি ফাংশন কল (কল-সংরক্ষিত) মাধ্যমে তাদের সম্পত্তি সংরক্ষণের জন্য দরকারী। ESI, EDI, EBX, EBP, ESP কল-সংরক্ষিত রয়েছে যেখানে EAX, ECX এবং EDX কল-সংরক্ষিত নেই। কল-সংরক্ষিত রেজিস্টারগুলিকে সি লাইব্রেরি ফাংশন দ্বারা সম্মান করা হয় এবং সি লাইব্রেরি ফাংশন কলগুলির মাধ্যমে তাদের মানগুলি বজায় থাকে।

জেফ ডন্টেনম্যান তার অ্যাসেম্বলি ভাষার বইতে কমান্ড লাইনের আর্গুমেন্টগুলি মুদ্রণের জন্য একটি অ্যাসেম্বলি কোড রয়েছে। কোডগুলি কাউন্টারগুলি সঞ্চয় করতে এসিআই এবং এডি ব্যবহার করে কারণ সেগুলি সি লাইব্রেরির ফাংশন প্রিন্টফ দ্বারা অপরিবর্তিত থাকবে। ই্যাক্স, ই্যাক্স, এডিএক্সের মতো অন্যান্য রেজিস্টারের ক্ষেত্রে সি লাইব্রেরি ফাংশনগুলি ব্যবহার না করার কোনও গ্যারান্টি নেই।

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

বিভাগ দেখুন 12.8 কীভাবে কমান্ড-লাইন যুক্তি দেখায়।

মনে রাখবেন যে 64৪-বিট কলিং কনভেনশনগুলি 32-বিট কলিং কনভেনশন থেকে আলাদা এবং আমি নিশ্চিত নই যে এই রেজিস্টারগুলি কল-সংরক্ষিত আছে কি না।


বেশিরভাগ মানুষ "উদ্বায়ী" / "অ-উদ্বায়ী", বা "কলি-সেভড" বনাম "কলার-সেভড" বলে ডাকে "পবিত্র" কখনও শুনিনি। আমি "কল-সংরক্ষিত" / "কল-ক্লোবারড" পছন্দ করি, কারণ এটি বোঝায় না যে তারা আসলে যে কোনও জায়গায় সংরক্ষণ করেছে। যাইহোক, ইএসআই / আরএসআই এবং ইডিআই / আরডিআই কল-সংরক্ষিত নয় x86-64 সিস্টেম ভি এবিআইতে।
পিটার কর্ডস

এছাড়াও, আপনি সাধারণ 32-বিট কলিং কনভেনশনে কল-সংরক্ষিত হিসাবে EBP এবং ESP তালিকাভুক্ত করতে ভুলে গেছেন।
পিটার কর্ডস

1
যাইহোক, এটি একটি খুব ভাল পয়েন্ট। প্রকৃত কোডে, আপনি কোনও নির্দেশাবলীর জন্য বিশেষ হওয়ার কারণে কলিং-কনভেনশন কারণগুলির ভিত্তিতে কোনও কিছুর জন্য ইডিআই / ইএসআই বেছে নেওয়ার সম্ভাবনা বেশি।
পিটার কর্ডস

আমি কল-সংরক্ষিত পছন্দ করি। আমি উত্তরটি একই সাথে আপডেট করেছি। পর্যালোচনা করার জন্য ধন্যবাদ।
জে রাজপুত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.