এসিডাব্লায় ইডিআই এবং ইএসআই নিবন্ধগুলির আসল উদ্দেশ্য এবং ব্যবহার কী?
আমি জানি তারা একটি জিনিসের জন্য স্ট্রিং অপারেশনের জন্য ব্যবহৃত হয়।
কেউ কি উদাহরণ দিতে পারে?
এসিডাব্লায় ইডিআই এবং ইএসআই নিবন্ধগুলির আসল উদ্দেশ্য এবং ব্যবহার কী?
আমি জানি তারা একটি জিনিসের জন্য স্ট্রিং অপারেশনের জন্য ব্যবহৃত হয়।
কেউ কি উদাহরণ দিতে পারে?
উত্তর:
কয়েকটি অপারেশন রয়েছে যা আপনি কেবল ডিআই / এসআই দিয়ে করতে পারেন (বা তাদের বর্ধিত সহযোগীরা, যদি আপনি 1985 সালে এএসএম না শিখেন)। এর মধ্যে রয়েছে
REP STOSB
REP MOVSB
REP SCASB
যা যথাক্রমে পুনরাবৃত্তি (= ভর) সঞ্চয়, লোডিং এবং স্ক্যানিংয়ের জন্য অপারেশন। আপনি যা করেন তা হ'ল আপনি এসআই এবং / অথবা ডিআই সেটআপ করে এক বা উভয় অপারেশনগুলিকে নির্দেশ করতে, সম্ভবত সিক্সে একটি গণনা রেখে তারপরে 'এরপ' কেটে ফেলা যাক। এগুলি এমন ক্রিয়াকলাপ যা একবারে একগুচ্ছ বাইটগুলিতে কাজ করে এবং তারা সিপিইউকে স্বয়ংক্রিয়ভাবে রাখে। যেহেতু আপনি স্পষ্টভাবে লুপগুলি কোডিং করছেন না, তারা তাদের কাজটি হ্যান্ড কোডেড লুপের চেয়ে বেশি দক্ষতার সাথে (সাধারণত) করে।
আপনি যদি ভাবছেন: আপনি কীভাবে অপারেশনটি সেট আপ করেছেন তার উপর নির্ভর করে বারবার স্টোর করা সহজ 0 মুল্যটিকে 0 মেমরির একটি বৃহত সংলগ্ন ব্লকের মধ্যে ঘুষি দেওয়ার মতো হতে পারে; আমি মনে করি, এক বাফার থেকে ডেটা অনুলিপি করতে ভালভাবে এমওভিএসবি ব্যবহার করা হয়েছে (ভাল, কোনও গুচ্ছ বাইট) অন্যটিতে; এবং এসসিএএসবি এমন কিছু বাইট অনুসন্ধান করতে ব্যবহৃত হয় যা কিছু অনুসন্ধানের মানদণ্ডের সাথে মেলে (আমি নিশ্চিত নই যে এটি কেবল সাম্যের দিকে অনুসন্ধান করছে বা কী - আপনি এটি সন্ধান করতে পারেন :))
এই রেগগুলির জন্য বেশিরভাগই।
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
। লক্ষ্য করুন যে তৃতীয় নির্দেশটি edi
4 দ্বারা মলিটপ্লাইড ব্যবহার করে এবং 0x54 দ্বারা ebp
অফসেট যুক্ত করে (এর অবস্থান)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!
অন্যান্য উত্তরে উল্লিখিত স্ট্রিং অপারেশনগুলি (এমওভিএস / আইএনএস / স্টোস / সিএমপিএস / এসসিএএসবি / ডাব্লু / ডি / কিউ ইত্যাদি) ছাড়াও, আমি যুক্ত করতে চেয়েছিলাম যে আরও "আধুনিক" এক্স ৮86 বিধানসভার নির্দেশাবলীও রয়েছে যা এখানে স্পষ্টভাবে ব্যবহার করা হয়েছে সর্বনিম্ন ইডিআই / আরডিআই:
SSE2 MASKMOVDQU
(এবং আসন্ন AVXVMASKMOVDQU
) নির্দেশাবলী নির্বাচনীভাবে এক্সএমএম রেজিস্টার থেকে ইডিআই / আরডিআই দ্বারা চিহ্নিত স্মৃতিতে বাইটগুলি লিখুন।
গণ পরিচালনার জন্য নিবন্ধকগুলি ব্যবহার করা ছাড়াও, তারা 32-বিট কলিং কনভেনশনে একটি ফাংশন কল (কল-সংরক্ষিত) মাধ্যমে তাদের সম্পত্তি সংরক্ষণের জন্য দরকারী। ESI, EDI, EBX, EBP, ESP কল-সংরক্ষিত রয়েছে যেখানে EAX, ECX এবং EDX কল-সংরক্ষিত নেই। কল-সংরক্ষিত রেজিস্টারগুলিকে সি লাইব্রেরি ফাংশন দ্বারা সম্মান করা হয় এবং সি লাইব্রেরি ফাংশন কলগুলির মাধ্যমে তাদের মানগুলি বজায় থাকে।
জেফ ডন্টেনম্যান তার অ্যাসেম্বলি ভাষার বইতে কমান্ড লাইনের আর্গুমেন্টগুলি মুদ্রণের জন্য একটি অ্যাসেম্বলি কোড রয়েছে। কোডগুলি কাউন্টারগুলি সঞ্চয় করতে এসিআই এবং এডি ব্যবহার করে কারণ সেগুলি সি লাইব্রেরির ফাংশন প্রিন্টফ দ্বারা অপরিবর্তিত থাকবে। ই্যাক্স, ই্যাক্স, এডিএক্সের মতো অন্যান্য রেজিস্টারের ক্ষেত্রে সি লাইব্রেরি ফাংশনগুলি ব্যবহার না করার কোনও গ্যারান্টি নেই।
https://www.amazon.com/Assembly-Language-Step-Step-Programming/dp/0470497025
বিভাগ দেখুন 12.8 কীভাবে কমান্ড-লাইন যুক্তি দেখায়।
মনে রাখবেন যে 64৪-বিট কলিং কনভেনশনগুলি 32-বিট কলিং কনভেনশন থেকে আলাদা এবং আমি নিশ্চিত নই যে এই রেজিস্টারগুলি কল-সংরক্ষিত আছে কি না।