বেস পয়েন্টার এবং স্ট্যাক পয়েন্টার ঠিক কী? তারা কী বোঝায়?


225

উইকিপিডিয়া থেকে আগত এই উদাহরণটি ব্যবহার করে , যেখানে ড্রস্কয়ার () ড্রলাইন () কে কল করে,

বিকল্প পাঠ

(দ্রষ্টব্য যে এই চিত্রটির নীচের দিকে উচ্চ ঠিকানা এবং শীর্ষে নিম্ন ঠিকানা রয়েছে))

কেউ কি আমাকে ব্যাখ্যা কি গেল ebpএবং espএই প্রেক্ষাপটে হয়?

আমি যা দেখছি তা থেকে, আমি স্ট্যাকের পয়েন্টারটি সর্বদা স্ট্যাকের শীর্ষে এবং বর্তমান ফাংশনের শুরুতে বেস পয়েন্টারটি বলতে পারি? অথবা কি?


সম্পাদনা: উইন্ডোজ প্রোগ্রামগুলির প্রসঙ্গে আমি এটি বোঝাতে চাইছি

edit2: এবং কিভাবে eipকাজ করে?

edit3: আমার এমএসভিসি ++ থেকে নিম্নলিখিত কোড রয়েছে:

var_C= dword ptr -0Ch
var_8= dword ptr -8
var_4= dword ptr -4
hInstance= dword ptr  8
hPrevInstance= dword ptr  0Ch
lpCmdLine= dword ptr  10h
nShowCmd= dword ptr  14h

এগুলির সমস্তগুলি ডিফোর্ড বলে মনে হচ্ছে, এইভাবে প্রতি 4 টি বাইট নেয়। সুতরাং আমি দেখতে পাচ্ছি hInstance থেকে 4 বাইটের var_4 পর্যন্ত একটি ফাঁক রয়েছে। তারা কি? আমি ধরে নিলাম এটি রিটার্ন ঠিকানা, যেমন উইকিপিডিয়া ছবিতে দেখা যাবে?


(সম্পাদকের দ্রষ্টব্য: মাইকেল এর উত্তর থেকে একটি দীর্ঘ উক্তি সরিয়েছে, যা প্রশ্নে অন্তর্ভুক্ত নয়, তবে একটি অনুসরণ প্রশ্নটি সম্পাদনা করা হয়েছিল):

এটি কারণ ফাংশন কলটির প্রবাহ হ'ল:

* Push parameters (hInstance, etc.)
* Call function, which pushes return address
* Push ebp
* Allocate space for locals

আমার প্রশ্ন (সর্বশেষে, আমি আশা করি!) এখন হ'ল, তাত্ক্ষণিকভাবে ঠিক কী ঘটেছিল আমি প্রোলোগুলির শেষের দিকে ফোন করতে চাইছি এমন ফাংশনটির যুক্তিগুলি পপ করার জন্য? আমি জানতে চাই যে এই মুহুর্তগুলিতে ebp, esp কীভাবে বিকশিত হয় (আমি ইতিমধ্যে বুঝতে পারি কীভাবে প্রলজ কাজ করে, আমি কেবল স্ট্যাকের উপরে এবং প্রলোগের আগে যুক্তিগুলি ঠেকানোর পরে কী ঘটছে তা জানতে চাই)।


23
একটি গুরুত্বপূর্ণ বিষয় লক্ষণীয় হ'ল স্ট্যাকটি স্মৃতিতে "নীচের দিকে" বৃদ্ধি পায়। এর অর্থ হ'ল স্ট্যাক পয়েন্টারটিকে উপরের দিকে সরানোর জন্য আপনি এর মান হ্রাস করবেন।
বিএস

4
ইবিপি / ইএসপি এবং ইআইপি কী করছে তার পার্থক্য করার একটি ইঙ্গিত: ইবিপি এবং ইএসপি ডেটা নিয়ে কাজ করে, যখন ইআইপি কোড নিয়ে কাজ করে।
মিমি মিমম্ম মিমি

2
আপনার গ্রাফে, ebp (সাধারণত) হ'ল "ফ্রেম পয়েন্টার", "স্ট্যাক পয়েন্টার" esp করুন। এটি স্থানীয়দের [ebp-x] এর মাধ্যমে এবং স্ট্যাক প্যারামিটারগুলির মাধ্যমে [ebp + x] ধারাবাহিকভাবে স্ট্যাক পয়েন্টার (যা প্রায়শই একটি ফাংশনের মধ্যে পরিবর্তিত হয়) এর মাধ্যমে স্থানীয়দের অ্যাক্সেস করতে দেয় access ইএসপি-র মাধ্যমে অ্যাড্রেসিং করা যেতে পারে, অন্যান্য ক্রিয়াকলাপের জন্য ইবিপি মুক্ত করে - কিন্তু এইভাবে, ডিবাগাররা কল স্ট্যাক বা স্থানীয়দের মান বলতে পারে না।
পিটারচেন

4
@Ben। নেসেসরিলি নয়। কিছু সংকলক স্ট্যাক ফ্রেমগুলি গাদা মধ্যে রাখে। স্ট্যাকের ক্রমবর্ধমান ধারণাটি ঠিক এটি, এমন একটি ধারণা যা এটি বুঝতে সহজ করে তোলে। স্ট্যাকের বাস্তবায়ন যে কোনও কিছু হতে পারে (গাদা র্যান্ডম অংশগুলি হ্যাকগুলি তৈরি করে যা স্ট্যাকের অংশগুলিকে অনেক শক্ত করে ওভাররাইট করে তোলে কারণ তারা নির্বিচারক নয়)।
মার্টিন ইয়র্ক

1
দুটি কথায়: স্ট্যাক পয়েন্টারটি পুশ / পপ ক্রিয়াকলাপগুলিকে কাজ করতে দেয় (সুতরাং পুশ এবং পপ জানে কোথায় ডেটা রাখা / পেতে হবে)। বেস পয়েন্টার কোডটিকে স্বাধীনভাবে রেফারেন্স ডেটা দেয় যা স্ট্যাকের আগে ধাক্কা দেওয়া হয়েছিল।
tigrou

উত্তর:


228

esp আপনি যেমনটি বলেন ঠিক তেমন, স্ট্যাকের শীর্ষ।

ebpসাধারণত espফাংশন শুরুতে সেট করা হয়। ফাংশন প্যারামিটার এবং স্থানীয় ভেরিয়েবলগুলি যথাক্রমে অফসেট থেকে যোগ করে এবং বিয়োগ করে অ্যাক্সেস করা হয় ebp। সমস্ত x86 কলিং কনভেনশনগুলি ebpফাংশন কল জুড়ে সংরক্ষিত হিসাবে সংজ্ঞায়িত করে। ebpনিজেই পূর্ববর্তী ফ্রেমের বেস পয়েন্টারটিকে নির্দেশ করে, যা একটি ডিবাগারে স্ট্যাক হাঁটা এবং অন্যান্য ফ্রেমগুলি স্থানীয় ভেরিয়েবলগুলি কাজ করতে সক্ষম করে।

বেশিরভাগ ফাংশন প্রোলোগুলি দেখতে এমন কিছু দেখায়:

push ebp      ; Preserve current frame pointer
mov ebp, esp  ; Create new frame pointer pointing to current stack top
sub esp, 20   ; allocate 20 bytes worth of locals on stack.

তারপরে ফাংশনটিতে আপনার মতো কোড থাকতে পারে (উভয় স্থানীয় ভেরিয়েবলগুলি 4 বাইট হয়)

mov [ebp-4], eax    ; Store eax in first local
mov ebx, [ebp - 8]  ; Load ebx from second local

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

সম্পাদনা করুন:

আপনার আপডেট হওয়া প্রশ্নের জন্য, স্ট্যাকের মধ্যে দুটি অনুপস্থিত নিখোঁজ রয়েছে:

var_C = dword ptr -0Ch
var_8 = dword ptr -8
var_4 = dword ptr -4
*savedFramePointer = dword ptr 0*
*return address = dword ptr 4*
hInstance = dword ptr  8h
PrevInstance = dword ptr  0C
hlpCmdLine = dword ptr  10h
nShowCmd = dword ptr  14h

এটি কারণ ফাংশন কলটির প্রবাহ হ'ল:

  • প্যারামিটারগুলি ( hInstanceইত্যাদি) পুশ করুন
  • কল ফাংশন, যা প্রত্যাবর্তনের ঠিকানা ঠেলে দেয়
  • ধাক্কা ebp
  • স্থানীয়দের জন্য জায়গা বরাদ্দ

1
ব্যাখ্যার জন্য ধন্যবাদ! তবে আমি এখন বিভ্রান্ত হয়ে পড়েছি। ধরে নেওয়া যাক আমি একটি ফাংশন বলি এবং আমি এর প্রলোগের প্রথম লাইনে আছি, এখনও এটি থেকে একটি লাইন কার্যকর না করেই। এই মুহুর্তে, ebp এর মান কী? স্ট্যাকের কি ধাক্কা দেওয়া আর্গুমেন্টের পাশাপাশি সেই সময়ে কিছু আছে? ধন্যবাদ!
ইলিজিয়াম গ্রাস করেছে

3
ইবিপি ম্যাজিকালি পরিবর্তিত হয়নি, সুতরাং আপনি আপনার ফাংশনের জন্য একটি নতুন ইবিপি স্থাপন না করা পর্যন্ত আপনার কাছে কলারের মূল্য থাকবে। এবং যুক্তি ছাড়াও, স্ট্যাকটি পুরানো
ইআইপিও রাখবে

3
চমৎকার উত্তর. যদিও এপিলোগের মধ্যে রয়েছে তা উল্লেখ না করে এটি সম্পূর্ণ হতে পারে না: "ছুটি" এবং "ret" নির্দেশাবলী।
কলমারিয়াস

2
আমি মনে করি এই চিত্রটি প্রবাহ কী তা নিয়ে কিছু বিষয় পরিষ্কার করতে সহায়তা করবে। এছাড়াও মনে রাখবেন স্ট্যাকটি নীচের দিকে বাড়ছে। ocw.cs.pub.ro/courses/_media/so/laboratoare/call_stack.png
আন্দ্রে-নিকুলা পেট্রে

এটি কি আমি, বা উপরের কোড স্নিপেট থেকে সমস্ত বিয়োগ চিহ্নগুলি অনুপস্থিত?
বারবারাওয়ার্ক

96

ইএসপি হ'ল বর্তমান স্ট্যাক পয়েন্টার, যা কোনও শব্দ বা ঠিকানা যে কোনও সময় ধাক্কা দিলে বা স্ট্যাকের বাইরে বন্ধ করে দেওয়া বা পরিবর্তিত হবে change ইএসপি সরাসরি ইএসপি ব্যবহারের চেয়ে কোনও ফাংশনের পরামিতি এবং স্থানীয় ভেরিয়েবলগুলি ট্র্যাক করে রাখার জন্য কম্পাইলারের পক্ষে আরও সুবিধাজনক উপায়।

সাধারণত (এবং এটি সংকলক থেকে সংকলক পরিবর্তিত হতে পারে), কল করা একটি ফাংশন থেকে সমস্ত আর্গুমেন্ট কলিং ফাংশন দ্বারা স্ট্যাকের দিকে ধাক্কা দেওয়া হয় (সাধারণত বিপরীত ক্রমে যে ফাংশন প্রোটোটাইপে তারা ঘোষিত হয় তবে এটি পরিবর্তিত হয়) । তারপরে ফাংশনটি বলা হয়, যা স্ট্যাকের মধ্যে রিটার্ন ঠিকানা (ইআইপি) ঠেলে দেয়।

ফাংশনে প্রবেশের পরে, পুরাতন EBP মানটিকে স্ট্যাকের দিকে ঠেলে দেওয়া হয় এবং EBP ESP এর মানতে সেট করা হয়। তারপরে ফাংশনটির স্থানীয় ভেরিয়েবল এবং অস্থায়ীগুলির জন্য স্থান বরাদ্দ করার জন্য ESP হ্রাস করা হয়েছে (কারণ স্ট্যাকটি মেমরিতে নীচের দিকে বৃদ্ধি পায়)। সেই বিন্দু থেকে, ফাংশনটি সম্পাদনের সময়, ফাংশনটিতে যুক্তিগুলি ইবিপি থেকে ইতিবাচক অফসেটগুলিতে স্ট্যাকের উপরে অবস্থিত (কারণ ফাংশন কলের আগে তারা ধাক্কা দিয়েছিল), এবং স্থানীয় ভেরিয়েবলগুলি ইবিপি থেকে নেতিবাচক অফসেটে অবস্থিত are (কারণ ফাংশন প্রবেশের পরে এগুলি স্ট্যাকের জন্য বরাদ্দ দেওয়া হয়েছিল)। এজন্য ইবিপিকে ফ্রেম পয়েন্টার বলা হয় , কারণ এটি ফাংশন কল ফ্রেমের কেন্দ্রস্থলে নির্দেশ করে ।

প্রস্থান করার পরে, সমস্ত ফাংশনটি করতে হবে EBP এর মানকে ESP সেট করা (যা স্ট্যাক থেকে স্থানীয় ভেরিয়েবলগুলি কমিয়ে দেয় এবং স্ট্যাকের শীর্ষে প্রবেশের EBP উন্মুক্ত করে), তারপরে স্ট্যাক থেকে পুরানো EBP মানটি পপ করুন, এবং তারপরে ফাংশনটি ফিরে আসে (রিটার্নের ঠিকানাটি ইআইপি-র মধ্যে পপিং)।

কলিং ফাংশনে ফিরে আসার পরে, এটি অন্য ফাংশনটি কল করার ঠিক আগে স্ট্যাকের উপরে চাপানো ফাংশন আর্গুমেন্টগুলি সরিয়ে ফেলতে ESP বৃদ্ধি করতে পারে। এই মুহুর্তে, স্ট্যাকটি একই অবস্থায় ফিরে এসেছিল এটি ডাকা ফাংশনটি শুরু করার আগে ছিল।


15

আপনার ঠিক আছে। স্ট্যাক পয়েন্টারটি স্ট্যাকের শীর্ষ আইটেমের দিকে নির্দেশ করে এবং ফাংশন বলার আগে বেস পয়েন্টারটি স্ট্যাকের "পূর্ববর্তী" শীর্ষে নির্দেশ করে

আপনি যখন কোনও ফাংশন কল করবেন, কোনও স্থানীয় ভেরিয়েবল স্ট্যাকের মধ্যে সংরক্ষণ করা হবে এবং স্ট্যাক পয়েন্টারটি বাড়ানো হবে। আপনি যখন ফাংশন থেকে ফিরে আসেন, স্ট্যাকের সমস্ত স্থানীয় ভেরিয়েবলগুলি সুযোগের বাইরে চলে যায়। আপনি বেস পয়েন্টারটিতে স্ট্যাক পয়েন্টারটি সেট করে এটি করেন (যা ফাংশন কলের আগে "পূর্ববর্তী" শীর্ষ ছিল)।

এইভাবে মেমরি বরাদ্দ করা খুব , খুব দ্রুত এবং দক্ষ।


14
@ রবার্ট: আপনি যখন ফাংশন বলার আগে স্ট্যাকের "পূর্ববর্তী" শীর্ষটি বলবেন, আপনি উভয় পরামিতি উপেক্ষা করছেন, যা ফাংশন এবং কলার ইআইপি কল করার ঠিক আগে স্ট্যাকের দিকে ধাক্কা দেওয়া হয়। এটি পাঠকদের বিভ্রান্ত করতে পারে। আসুন আমরা কেবল এটিই বলি যে একটি স্ট্যান্ডার্ড স্ট্যাক ফ্রেমে, ইবিপি একই জায়গায় পয়েন্ট করে যেখানে ফাংশনে প্রবেশের ঠিক পরে ইএসপি পয়েন্ট করেছে।
উইগি

7

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

প্রথম স্থানীয় ভেরিয়েবল হিসাবে কলার ইবিপি সংরক্ষণ করার জন্য স্ট্যান্ডার্ড স্ট্যাক ফ্রেম বলা হয় এবং এটি উইন্ডোজে প্রায় সমস্ত কলিং কনভেনশনের জন্য ব্যবহৃত হতে পারে। কলার বা কলি পাসের প্যারামিটারগুলি নির্ধারণ করে এবং কোন প্যারামিটারগুলি রেজিস্টারে পাস করা হয় তা পার্থক্য বিদ্যমান তবে এগুলি স্ট্যান্ডার্ড স্ট্যাক ফ্রেমের সমস্যার সাথে সংলগ্ন।

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

এই ফ্রেম পয়েন্টার অমিশনটির অর্থ হ'ল সংকলক কোনও পুরানো EBP কোনও স্ট্যান্ডার্ড জায়গায় সংরক্ষণ করে না এবং অন্য কোনও কিছুর জন্য ইবিপি রেজিস্টার ব্যবহার করে, সুতরাং স্থানীয় ভেরিয়েবলগুলি প্রদত্ত ফাংশনের জন্য কতটা স্থান প্রয়োজন তা জেনেও আপনি কলার ইআইপি খুঁজে পেতে অসুবিধা হয়। অবশ্যই মাইক্রোসফ্ট এমন একটি এপিআই সরবরাহ করে যা আপনাকে এই ক্ষেত্রে স্ট্যাক-ওয়াক করার অনুমতি দেয় তবে PDB ফাইলগুলিতে সিম্বল টেবিল ডাটাবেসটি সন্ধান করতে কিছুটা ব্যবহারের ক্ষেত্রে খুব বেশি সময় লাগে।

আপনার সংকলন ইউনিটগুলিতে এফপিও এড়ানোর জন্য আপনাকে / O2 ব্যবহার এড়াতে হবে বা আপনার প্রকল্পের C ++ সংকলন পতাকাগুলিতে স্পষ্টভাবে / Oy- যুক্ত করতে হবে। আপনি সম্ভবত সি বা সি ++ রানটাইমের বিপরীতে লিঙ্ক করেছেন, যা রিলিজ কনফিগারেশনে এফপিও ব্যবহার করে, তাই dbghlp.dll ছাড়া স্ট্যাক ওয়াক করতে আপনার খুব কঠিন সময় আসবে।


কীভাবে স্ট্যাকের মধ্যে ইআইপি সংরক্ষণ করা হয় তা আমি পাই না। এটি কি নিবন্ধক হওয়া উচিত নয়? স্ট্যাকের মধ্যে কীভাবে একটি নিবন্ধক থাকতে পারে? ধন্যবাদ!
ইলিজিয়াম

কলকারী ইআইপি কল কল দিয়ে নিজেই স্ট্যাকের উপরে ঠেলাঠেলি করে। আরইটি নির্দেশাবলী কেবল স্ট্যাকের শীর্ষটি এনে এটি ইআইপিতে রাখে। আপনার যদি বাফারকে অতিক্রম করে থাকে তবে এই সত্যটি কোনও সুবিধাযুক্ত থ্রেড থেকে ব্যবহারকারীর কোডে ঝাঁপিয়ে পড়তে ব্যবহৃত হতে পারে।
উইগি

@ ডিভোড্রেলিসিয়াম ইআইপি নিবন্ধের বিষয়বস্তু (বা মান ) স্ট্যাক লাগিয়ে দেওয়া হয়েছে (বা অনুলিপি করা হয়েছে), নিজেই নিবন্ধভুক্ত নয়।
বারবারাওয়ার্ক

@ বারবারকওয়ার্ক মান- যোগ্য ইনপুট জন্য ধন্যবাদ । আমার উত্তর থেকে ওপি কী অনুপস্থিত তা আমি দেখতে পেলাম না। প্রকৃতপক্ষে, নিবন্ধগুলি যেখানে রয়েছে সেখানেই থাকে, কেবলমাত্র তাদের মান সিপিইউ থেকে র‌্যামে প্রেরণ করা হয়। এএমডি mode64 মোডে এটি কিছুটা জটিল হয়ে ওঠে, তবে এটিকে অন্য একটি প্রশ্নে রেখে দিন।
উইগি

কি amd64 সম্পর্কে? আমি কৌতুহলী.
বারবারাওয়ার্ক

6

প্রথমত, স্ট্যাক পয়েন্টারটি স্ট্যাকের নীচে নির্দেশ করে যেহেতু x86 স্ট্যাকগুলি উচ্চ ঠিকানার মান থেকে নিম্ন ঠিকানা মানগুলিতে তৈরি করে। স্ট্যাক পয়েন্টারটি সেই বিন্দু যেখানে পরের কলটি পুশ করতে (বা কল) পরবর্তী মান স্থাপন করবে। এটি অপারেশন সি / সি ++ স্টেটমেন্টের সমতুল্য:

 // push eax
 --*esp = eax
 // pop eax
 eax = *esp++;

 // a function call, in this case, the caller must clean up the function parameters
 move eax,some value
 push eax
 call some address  // this pushes the next value of the instruction pointer onto the
                    // stack and changes the instruction pointer to "some address"
 add esp,4 // remove eax from the stack

 // a function
 push ebp // save the old stack frame
 move ebp, esp
 ... // do stuff
 pop ebp  // restore the old stack frame
 ret

বেস পয়েন্টারটি বর্তমান ফ্রেমের শীর্ষে রয়েছে। ইবিপি সাধারণত আপনার ফিরতি ঠিকানার দিকে নির্দেশ করে। আপনার ফাংশনের প্রথম প্যারামিটারকে ইবিপি + 4 পয়েন্ট করে (বা কোনও শ্রেণি পদ্ধতির এই মান)। ebp-4 আপনার ফাংশনের প্রথম স্থানীয় ভেরিয়েবলের দিকে নির্দেশ করে, সাধারণত ebp এর পুরানো মান যাতে আপনি পূর্ববর্তী ফ্রেম পয়েন্টারটি পুনরুদ্ধার করতে পারেন।


2
না, ESP স্ট্যাকের নীচে নির্দেশ করে না । মেমরি অ্যাড্রেসিং স্কিম এর সাথে কোনও সম্পর্ক নেই। স্ট্যাকটি নিম্ন বা উচ্চতর ঠিকানাগুলিতে বৃদ্ধি পায় কিনা তা বিবেচ্য নয়। স্ট্যাকের "শীর্ষ" সর্বদা থাকে যেখানে পরবর্তী মানটি ধাক্কা দেওয়া হবে (স্ট্যাকের শীর্ষে স্থাপন করা হবে), বা অন্যান্য আর্কিটেকচারে, যেখানে শেষ ধাক্কা মানটি রাখা হয়েছে এবং বর্তমানে এটি কোথায় রয়েছে। সুতরাং, ইএসপি সর্বদা স্ট্যাকের শীর্ষে নির্দেশ করে।
বারবারাওয়ার্ক

1
নীচে বা বেস স্ট্যাকের অন্যদিকে কোথায় প্রথম (অথবা প্রাচীনতম ) মান রাখা হয়েছে, এবং তারপর আরো সাম্প্রতিক মান দ্বারা আচ্ছাদিত। ইবিপির জন্য "বেস পয়েন্টার" নামটি এখান থেকেই এসেছে: এটি একটি সাব্রোটিনের বর্তমান স্থানীয় স্ট্যাকের বেস (বা নীচে) দিকে নির্দেশ করার কথা ছিল।
বারবারাওয়ার্ক

বারবারা, ইন্টেল x86 এ, স্ট্যাকটি ইউপিএসডি ডাউন। স্ট্যাকের শীর্ষে স্ট্যাকের উপরে ধাক্কা দেওয়া প্রথম আইটেম থাকে এবং প্রতিটি আইটেমের পরে উপরের আইটেমের নীচে ধাক্কা দেওয়া হয়। স্ট্যাকের নীচের অংশে যেখানে নতুন আইটেম স্থাপন করা হয়েছে। প্রোগ্রামগুলি 1k থেকে শুরু করে মেমরিতে স্থাপন করা হয় এবং অনন্ত পর্যন্ত বেড়ে যায়। স্ট্যাকটি অসীম থেকে শুরু হয়, বাস্তবিকভাবে সর্বাধিক মেম মাইনাস রম, এবং 0. এর দিকে বেড়ে যায় E
jmucchiello

1

দীর্ঘদিন যাবত আমি অ্যাসেম্বলি প্রোগ্রামিং করেছি, তবে এই লিঙ্কটি কার্যকর হতে পারে ...

প্রসেসরের রেজিস্ট্রিগুলির একটি সংগ্রহ রয়েছে যা ডেটা সঞ্চয় করতে ব্যবহৃত হয়। এর মধ্যে কয়েকটি হ'ল প্রত্যক্ষ মান এবং অন্যরা র‌্যামের মধ্যে থাকা কোনও অঞ্চলের দিকে নির্দেশ করে are নিবন্ধগুলি নির্দিষ্ট সুনির্দিষ্ট ক্রিয়াগুলির জন্য ব্যবহৃত হয় এবং সমাবেশে প্রতিটি অপরেন্ড নির্দিষ্ট রেজিস্টারে নির্দিষ্ট পরিমাণের ডেটা প্রয়োজন।

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

বেস রেজিস্টার বা সেগমেন্ট রেজিস্টারগুলি কেবলমাত্র বিশাল পরিমাণে ডেটার ঠিকানা স্পেসে নির্দেশ করে। দ্বিতীয় নিবন্ধকের সাথে একত্রিত, বেস পয়েন্টারটি মেমোরিটিকে বিশাল ব্লকগুলিতে ভাগ করে দেবে, যখন দ্বিতীয় নিবন্ধকটি এই ব্লকের মধ্যে থাকা কোনও আইটেমকে নির্দেশ করবে। এর জন্য বেজ পয়েন্টারগুলি ডেটার ব্লকের ভিত্তিতে নির্দেশ করে।

মনে রাখবেন যে সমাবেশটি খুব সিপিইউ নির্দিষ্ট। আমি যে পৃষ্ঠাটি লিঙ্ক করেছি তাতে সিপিইউ'র বিভিন্ন ধরণের তথ্য সরবরাহ করা হয়।


বিভাগের রেজিস্টারগুলি x86-এ আলাদা they এগুলি জিএস, সিএস, এসএস এবং আপনি মেমরি ম্যানেজমেন্ট সফটওয়্যারটি না লিখলে আপনি সেগুলি কখনও স্পর্শ করবেন না।
মাইকেল 18

ডিএস হ'ল সেগমেন্ট রেজিস্টার এবং এমএস-ডস এবং ১its-বিট কোডের দিনগুলিতে আপনাকে অবশ্যই মাঝে মাঝে মাঝে এই সেগমেন্টের রেজিস্টারগুলি পরিবর্তন করতে হবে, কারণ তারা কখনই র‌্যামের KB৪ কেবি-র বেশি নির্দেশ করতে পারে না। তবুও ডস 1 এমবি পর্যন্ত মেমরি অ্যাক্সেস করতে পারে কারণ এটি 20-বিট ঠিকানা পয়েন্টার ব্যবহার করে। পরে আমরা 32-বিট সিস্টেম পেয়েছি, কিছু 36-বিট অ্যাড্রেস রেজিস্টার এবং এখন 64৪-বিট রেজিস্টার সহ। সুতরাং আজকাল আপনার আর এই বিভাগগুলির রেজিস্টারগুলি সত্যই বদলাতে হবে না।
উইম টেন ব্রিংক

কোনও আধুনিক ওএস 386 টি বিভাগ ব্যবহার করে না
আনা বেটস

@ পল: ভুল! ভুল! ভুল! 16-বিট বিভাগগুলি 32-বিট বিভাগ দ্বারা প্রতিস্থাপন করা হয়েছে। সুরক্ষিত মোডে, এটি মেমরিটির ভার্চুয়ালাইজেশনকে অনুমতি দেয়, মূলত প্রসেসরটিকে শারীরিক ঠিকানাগুলি লজিক্যাল মানচিত্রে ম্যাপ করার অনুমতি দেয়। যাইহোক, আপনার প্রয়োগের মধ্যে, জিনিসগুলি এখনও সমতল বলে মনে হচ্ছে, যেহেতু ওএস আপনার জন্য মেমরিটিকে ভার্চুয়ালাইজ করেছে। কার্নেলটি সুরক্ষিত মোডে কাজ করে, অ্যাপ্লিকেশনগুলিকে ফ্ল্যাট মেমরির মডেলটিতে চালানোর অনুমতি দেয়। আরও দেখুন en.wikedia.org/wiki/Prodected_mode
উইম টেন ব্রিং

@ ওয়ার্কশপ অ্যালেক্স: এটি প্রযুক্তিগত। সমস্ত আধুনিক ওএস সমস্ত বিভাগকে [0, FFFFFFF] এ সেট করে। সত্যিই এটি গণনা হয় না। এবং যদি আপনি লিঙ্কযুক্ত পৃষ্ঠাটি পড়েন, তবে আপনি দেখতে পাবেন যে সমস্ত অভিনব জিনিস পৃষ্ঠাগুলি দ্বারা সম্পন্ন হয়েছে, যা বিভাগগুলি আরও বেশি সূক্ষ্ম এবং খণ্ড are
এমসাল্টারস

-4

সম্পাদনা করুন হ্যাঁ, এই বেশিরভাগই ভুল। এটি আগ্রহী ক্ষেত্রে সম্পূর্ণ ভিন্ন কিছু বর্ণনা করে :)

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

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


ইবিপিটি কী তা বুঝতে আমি কিছুটা সমস্যায় পড়ছি। যদি আমাদের এমএএসএম কোডের 10 টি লাইন থাকে তবে এর অর্থ এই যে আমরা যখন এই লাইনগুলি চালাচ্ছি, ebp সর্বদা বৃদ্ধি পাবে?
ইলিজিয়াম গ্রাস করেছে

1
@ ডেভোরড - না এটি সত্য নয়। আইপি বাড়ছে।
মাইকেল 19

আপনি বোঝাতে চেয়েছেন যে আমি যা বলেছি তা সঠিক তবে ইবিপির পক্ষে নয়, আইইপি-র পক্ষে, এটি কি তাই?
ইলিজিয়াম

2
হ্যাঁ. EIP হ'ল নির্দেশ নির্দেশক এবং প্রতিটি নির্দেশ কার্যকর করার পরে স্পষ্টতই সংশোধন করা হয়।
মাইকেল 19

2
ওহ আমার খারাপ। আমি অন্য পয়েন্টার ভাবছি। আমি মনে করি আমি আমার মস্তিষ্ক ধুয়ে যাব।
স্টিফেন ফ্রেডারিচস

-8

esp এর অর্থ হ'ল "বর্ধিত স্ট্যাক পয়েন্টার" ..... "" সামথিং বেইস পয়েন্টার "এর জন্য ebp .... এবং" সামথিং ইন্সট্রাকশন পয়েন্টার "এর জন্য আইপ করুন ...... স্ট্যাক পয়েন্টারটি স্ট্যাক সেগমেন্টের অফসেট ঠিকানার দিকে নির্দেশ করে । বেস পয়েন্টারটি অতিরিক্ত বিভাগের অফসেট ঠিকানার দিকে নির্দেশ করে। নির্দেশ পয়েন্টার কোড বিভাগের অফসেট ঠিকানার দিকে নির্দেশ করে। এখন বিভাগগুলি সম্পর্কে ... সেগুলি প্রসেসরের মেমরি এরিয়ার ছোট ছোট 64 কেবি বিভাগ ..... এই প্রক্রিয়াটি মেমরি বিভাগে পরিচিত। আমি আশা করি এই পোস্টটি সহায়ক ছিল।


3
এটি একটি পুরানো প্রশ্ন, তবে, এসপি স্ট্যাক পয়েন্টার, বিপি মানে বেস পয়েন্টার এবং নির্দেশ নির্দেশকের জন্য আইপি। প্রত্যেকের শুরুতে ই কেবল 32 বিট পয়েন্টার বলছে।
হাইডেন

1
বিভাজন এখানে অপ্রাসঙ্গিক।
বারবারাওয়ার্ক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.