এটি কোথায় ঠেলাঠেলি করা হয়?
esp - 4
। আরো স্পষ্ট করে:
esp
4 দ্বারা বিয়োগ করা হয়
- মান ধাক্কা হয়
esp
pop
এই বিপরীত।
সিস্টেম ভি এবিআই লিনাক্সকে rsp
প্রোগ্রামটি চালু হওয়ার সাথে সাথে একটি সংবেদনশীল স্ট্যাকের অবস্থানের দিকে নির্দেশ করতে বলে : প্রোগ্রাম যখন চালু হয় তখন (ডিএসএম, লিনাক্স) ডিফল্ট রেজিস্ট্রার স্টেটটি কী? যা আপনার সাধারণত ব্যবহার করা উচিত।
আপনি কিভাবে একটি রেজিস্টার ঠেলাতে পারেন?
ন্যূনতম জিএনইউ জিএএস উদাহরণ:
.data
/* .long takes 4 bytes each. */
val1:
/* Store bytes 0x 01 00 00 00 here. */
.long 1
val2:
/* 0x 02 00 00 00 */
.long 2
.text
/* Make esp point to the address of val2.
* Unusual, but totally possible. */
mov $val2, %esp
/* eax = 3 */
mov $3, %ea
push %eax
/*
Outcome:
- esp == val1
- val1 == 3
esp was changed to point to val1,
and then val1 was modified.
*/
pop %ebx
/*
Outcome:
- esp == &val2
- ebx == 3
Inverses push: ebx gets the value of val1 (first)
and then esp is increased back to point to val2.
*/
উপরের গিটহাবের উপর চলমান অ্যাসেসরেন্স সহ ।
কেন এটি প্রয়োজন?
এটা সত্য যে এই নির্দেশাবলী সহজেই প্রয়োগ করা যেতে পারে mov
, add
এবং sub
।
তাদের অস্তিত্বের কারণ, এই যে নির্দেশাবলীর সংমিশ্রণগুলি এত ঘন ঘন হয়, সেই জন্য ইন্টেল সেগুলি আমাদের জন্য সরবরাহ করার সিদ্ধান্ত নিয়েছিল।
এই সংমিশ্রণগুলি এত ঘন ঘন হওয়ার কারণ হ'ল এগুলি নিবন্ধের মানগুলি অস্থায়ীভাবে মেমরিতে সংরক্ষণ এবং পুনরুদ্ধার করা সহজ করে যাতে তারা ওভাররাইট না করে।
সমস্যাটি বুঝতে, কয়েকটি সি কোড হাতে হাতে সংকলনের চেষ্টা করুন।
একটি বড় অসুবিধা হ'ল প্রতিটি ভেরিয়েবলটি কোথায় সংরক্ষণ করা হবে তা সিদ্ধান্ত নেওয়া।
আদর্শভাবে, সমস্ত ভেরিয়েবলগুলি নিবন্ধগুলিতে ফিট হবে যা অ্যাক্সেসের জন্য দ্রুততম মেমরি (বর্তমানে র্যামের চেয়ে প্রায় 100x দ্রুত )।
তবে অবশ্যই, আমরা সহজেই নিবন্ধগুলির তুলনায় আরও পরিবর্তনশীল থাকতে পারি, বিশেষ করে নেস্টেড ফাংশনগুলির যুক্তিগুলির জন্য, সুতরাং মেমোরিতে লেখার একমাত্র সমাধান।
আমরা যে কোনও স্মৃতি ঠিকানায় লিখতে পারি, তবে যেহেতু ফাংশন কল এবং রিটার্নের স্থানীয় ভেরিয়েবল এবং তর্কগুলি একটি দুর্দান্ত স্ট্যাক প্যাটার্নে ফিট করে, যা মেমরির খণ্ডন রোধ করে , এটিই এর মোকাবেলার সেরা উপায়। একটি হিপ বরাদ্দ লেখার উন্মাদতার সাথে এর তুলনা করুন।
তারপরে আমরা সংকলকগণকে আমাদের জন্য রেজিস্টার বরাদ্দ অনুকূলিত করতে দাও, যেহেতু এটি এনপি সম্পূর্ণ, এবং সংকলক লেখার সবচেয়ে শক্ত অংশগুলির মধ্যে একটি। এই সমস্যাটিকে রেজিস্টার বরাদ্দ বলা হয় , এবং এটি গ্রাফের বর্ণের থেকে বিচ্ছিন্ন ।
যখন সংকলকটির বরাদ্দকারী কেবল নিবন্ধের পরিবর্তে জিনিসগুলিকে মেমরিতে সঞ্চয় করতে বাধ্য করা হয়, এটি একটি স্পিল হিসাবে পরিচিত ।
এটি কি একক প্রসেসরের নির্দেশে ফোটায় বা আরও জটিল?
আমরা নিশ্চিতভাবে যা জানি তা হ'ল ইন্টেল একটি push
এবং একটি pop
নির্দেশকে দলিল করে , সুতরাং সেগুলি সেই দিক থেকে একটি নির্দেশ।
অভ্যন্তরীণভাবে, এটি একাধিক মাইক্রোকোডে প্রসারিত হতে পারে, একটি পরিবর্তন করতে esp
এবং একটিতে মেমরি আইও করতে এবং একাধিক চক্র গ্রহণ করতে পারে।
তবে এটি আরও সম্ভাব্য যে কোনও একক push
অন্যান্য নির্দেশাবলীর সমতুল্য সংমিশ্রণের চেয়েও দ্রুত, কারণ এটি আরও নির্দিষ্ট।
এটি বেশিরভাগই আন (ডার) নথিভুক্ত:
b
,w
,l
, অথবাq
মেমরি আকার কাজে ব্যবহৃত হচ্ছে বোঝাতে। প্রাক্তন:pushl %eax
এবংpopl %eax