সি / সি ++ এ ফাংশন কল স্ট্যাক ফ্রেম বোঝা?


19

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

আমি ভাবছি যে কোন রেজিস্টারগুলি প্রত্যাবর্তনের জন্য ব্যবহৃত হয় বা মান পরামিতিগুলি দিয়ে যায়। তথ্যসূত্রগুলি কীভাবে ফিরে আসে? সংকলকটি কীভাবে Eax, ebx, ecx এবং edx এর মধ্যে চয়ন করতে পারে?

ফাংশন কল চলাকালীন রেজিস্টার, স্ট্যাক এবং হিপ রেফারেন্সগুলি কীভাবে ব্যবহৃত হয়, নির্মিত হয় এবং ধ্বংস হয় তা বুঝতে আমার কী জানতে হবে?


এটি পড়ার চেয়ে শক্ত (পাঠ্য প্রাচীর)। আপনি কি আপনার পোস্টটি আরও ভাল আকারে সম্পাদনা করতে আপত্তি করবেন ?
gnat

1
এই প্রশ্নটি বরং আমার কাছে বিস্তৃত বলে মনে হচ্ছে। এছাড়াও, এটি খুব প্ল্যাটফর্ম-নির্দিষ্ট হতে চলেছে না?
কাজার্ক

এসও তেও জিজ্ঞাসা করা হয়েছিল: স্ট্যাকওভারফ্লো.com
ওয়েন কনরাড

উত্তর:


11

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

সুতরাং, একটি সাধারণ "জেনেরিক" সিস্টেমে ফাংশন এ থেকে একটি ফাংশন বি কল করা নিম্নলিখিত পদক্ষেপগুলিতে জড়িত থাকতে পারে:

  • ফাংশন এ:
    • প্রত্যাবর্তনের মানের জন্য স্থানটি পুশ করুন
    • পরামিতি ধাক্কা
    • ফেরতের ঠিকানাটি চাপ দিন
  • বি ফাংশনে ঝাঁপ দাও
  • ফাংশন বি:
    • পূর্ববর্তী স্ট্যাক ফ্রেমের ঠিকানাটি চাপ দিন
    • এই ফাংশনটি ব্যবহার করে এমন নিবন্ধগুলির মানগুলিকে চাপ দিন (যাতে তারা পুনরুদ্ধার করতে পারে)
    • স্থানীয় ভেরিয়েবলের জন্য স্থানটি পুশ করুন
    • প্রয়োজনীয় গণনা করুন
    • নিবন্ধগুলি পুনরুদ্ধার করুন
    • পূর্ববর্তী স্ট্যাক ফ্রেমটি পুনরুদ্ধার করুন
    • ফাংশন ফলাফল সংরক্ষণ করুন
    • ফিরতি ঠিকানায় ঝাঁপ দাও
  • ফাংশন এ:
    • পরামিতিগুলি পপ করুন
    • রিটার্ন মান পপ করুন

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


এখানে "ধাক্কা" বলতে কী বোঝায়? এটি কী তৈরি করতে হবে তা আমার কোনও ধারণা নেই।
টোমা জ্যাটো - মনিকা 20

2
@ টোমাজাটো pushএবং popএকটি স্ট্যাকের দুটি মৌলিক কাজ। একটি স্ট্যাক বইয়ের স্ট্যাকের মতো একটি সর্বশেষে প্রথম-আউট কাঠামো। আপনি যখন push, স্ট্যাকের উপরে একটি নতুন অবজেক্ট রাখছেন; যখন আপনি popস্ট্যাকের শীর্ষ থেকে কোনও জিনিস নিচ্ছেন। আপনাকে মাঝখানে অবজেক্টগুলি সন্নিবেশ করতে বা সরাতে অনুমোদিত নয়, আপনি কেবল স্ট্যাকের শীর্ষে পরিচালনা করতে পারবেন। আপনি সাধারণত উইকিপিডিয়ায় স্ট্যাক এবং প্রোগ্রাম স্ট্যাক সম্পর্কে আরও পড়তে পারেন ।
কালেব

11

এটি কলিং কনভেনশন ব্যবহৃত হচ্ছে তার উপর নির্ভর করে। যে কেউ কলিং কনভেনশনটি সংজ্ঞায়িত করেন তারা চাইলে এই সিদ্ধান্ত নিতে পারেন।

X86-এ সর্বাধিক প্রচলিত কলিং কনভেনশনে, প্যারামিটারগুলি পাস করার জন্য নিবন্ধগুলি ব্যবহৃত হয় না; ডানদিকের প্যারামিটার দিয়ে শুরু করে স্ট্যাকের দিকে প্যারামিটারগুলি এগিয়ে দেওয়া হয়। রিটার্ন মানটি Eax এ স্থাপন করা হয় এবং অতিরিক্ত স্থানের প্রয়োজন হলে এটি edx ব্যবহার করতে পারে। রেফারেন্স এবং পয়েন্টার উভয়ই ইক্সে একটি ঠিকানা আকারে ফিরে আসে।


5

আপনি যদি স্ট্যাকটি খুব ভালভাবে বুঝতে পারেন তবে আপনি বুঝতে পারবেন প্রোগ্রামে মেমরি কীভাবে কাজ করে এবং প্রোগ্রামটিতে মেমরি কীভাবে কাজ করে তা আপনি বুঝতে পারবেন যে প্রোগ্রামে ফাংশন স্টোরটি কীভাবে এবং যদি আপনি বুঝতে পারেন প্রোগ্রামে ফাংশন স্টোরটি কীভাবে পুনরাবৃত্তির ফাংশন কাজ করে তা বুঝতে পারবেন এবং যদি আপনি কীভাবে পুনরাবৃত্তি ফাংশনটি কাজ করে তা আপনি বুঝতে পারবেন যে সংকলক কীভাবে কাজ করে এবং আপনি যদি বুঝতে পারেন যে কীভাবে সংকলক কাজ করে আপনার মনের সংকলক হিসাবে কাজ করবে এবং আপনি কোনও প্রোগ্রাম খুব সহজেই ডিবাগ করবেন

স্ট্যাকটি কীভাবে কাজ করে তা আমাকে ব্যাখ্যা করুন:

প্রথমে আপনাকে জানতে হবে কীভাবে স্ট্যাকের মধ্যে ফাংশন স্টোর রয়েছে:

হিপ স্টোর গতিশীল মেমরি বরাদ্দ মান। স্টোর স্টোর স্বয়ংক্রিয় বরাদ্দ এবং মুছে ফেলার মান।

এখানে চিত্র বর্ণনা লিখুন

আসুন উদাহরণ সহ বুঝতে পারি:

def hello(x):
    if x==1:
        return "op"
    else:
        u=1
        e=12
        s=hello(x-1)
        e+=1
        print(s)
        print(x)
        u+=1
    return e

hello(4)

এখন এই প্রোগ্রামের অংশগুলি বুঝতে:

এখানে চিত্র বর্ণনা লিখুন

এখন দেখা যাক কী স্ট্যাক এবং স্ট্যাক পার্টস কি:

এখানে চিত্র বর্ণনা লিখুন

স্ট্যাক বরাদ্দ:

কোনও জিনিস মনে রাখবেন যদি কোনও ফাংশন "রিটার্ন" পায় তা তার সমস্ত স্থানীয় ভেরিয়েবলগুলি লোড করেছে বা এটি যে কোনও কিছু তা সঙ্গে সঙ্গে স্ট্যাক থেকে ফিরে আসবে তার স্ট্যাক ফ্রেমটি। এর অর্থ যখন কোনও পুনরাবৃত্ত ফাংশন বেস কন্ডিশনটি পায় এবং আমরা বেস শর্তের পরে রিটার্ন রাখি তাই বেস শর্তটি স্থানীয় ভেরিয়েবলগুলি লোড করতে অপেক্ষা করবে না যা প্রোগ্রামের "অন্য" অংশে অবস্থিত এটি অবিলম্বে স্ট্যাক থেকে বর্তমান ফ্রেমটি ফিরিয়ে দেবে এবং এখন যদি একটি ফ্রেম হয় রিটার্ন পরবর্তী ফ্রেম অ্যাক্টিভেশন রেকর্ডে আছে। এটি ব্যবহারিকভাবে দেখুন:

এখানে চিত্র বর্ণনা লিখুন

ব্লকটির অবনতি:

সুতরাং এখনই যখনই কোনও ফাংশন রিটার্ন স্টেটমেন্ট খুঁজে পায় এটি স্ট্যাক থেকে বর্তমান ফ্রেম মুছে দেয়।

স্ট্যাকের মান থেকে ফিরে আসার সময় তারা স্ট্যাকের মধ্যে বরাদ্দ হওয়া বিপরীত ক্রমে ফিরে আসবে।

এখানে চিত্র বর্ণনা লিখুন

এগুলি খুব সংক্ষিপ্ত বিবরণ এবং আপনি যদি স্ট্যাক এবং ডাবল পুনরাবৃত্তি সম্পর্কে আরও গভীরভাবে জানতে চান তবে এই ব্লগের দুটি পোস্ট পড়ুন:

ধাপে ধাপে স্ট্যাক সম্পর্কে আরও

স্ট্যাক সহ ধাপে ধাপে ডাবল পুনরাবৃত্তি সম্পর্কে আরও


3

আপনি যা খুঁজছেন তাকে অ্যাপ্লিকেশন বাইনারি ইন্টারফেস - এবিআই বলে।

প্রতিটি সংকলকের জন্য একটি স্পেসিফিকেশন রয়েছে যা এবিআইকে বানান করে।

প্রতিটি প্ল্যাটফর্ম সাধারণত এবং সংস্থাগুলির মধ্যে আন্তঃআকক্ষীয়তা সমর্থন করার জন্য এবিআই নির্দিষ্ট করে দেবে। উদাহরণস্বরূপ, x86 কলিং কনভেনশনগুলি x86 এবং x86-64 এর জন্য সাধারণ কলিং কনভেনশনগুলিকে বানান করে। আমি তবে উইকিপিডিয়া থেকে আরও সরকারী নথি আশা করব।

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