ইবিপি ফ্রেম পয়েন্টার রেজিস্ট্রারের উদ্দেশ্য কী?


95

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

আমি বুঝতে পারি কেন ফ্রেম পয়েন্টার কোডটি ডিবাগ করা সহজতর করে এবং alloca()কোনও ফাংশনের মধ্যে ডাকা হলে এটি প্রয়োজনীয় হতে পারে । যাইহোক, x86 এর খুব কম রেজিস্টার রয়েছে এবং স্ট্যাক ফ্রেমের অবস্থান ধরে রাখতে তার দুটি ব্যবহার করে যখন আমার পক্ষে যথেষ্ট হয় তবে তা আমার কাছে বোধগম্য হয় না। ফ্রেম পয়েন্টার বাদ দেওয়া কেন অপ্টিমাইজড / রিলিজ বিল্ডগুলিতেও একটি খারাপ ধারণা হিসাবে বিবেচিত হয়?


20
আপনি যদি ভাবেন যে x86 এর খুব কম রেজিস্টার রয়েছে তবে আপনার 6502 টি পরীক্ষা করা উচিত :)
শেদাত কাপানোগলু


4
সি 99 ভিএলএও এতে উপকৃত হতে পারে।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件 法轮功


4
ফ্রেম পয়েন্টারটি কি স্ট্যাক পয়েন্টারটিকে অপ্রয়োজনীয় করে না? । টিএল; ডিআর: ১. অ-তুচ্ছ স্ট্যাক প্রান্তিককরণ ২. স্ট্যাক বরাদ্দ ( alloca) ৩. রানটাইম বাস্তবায়নের স্বাচ্ছন্দ্য: ব্যাতিক্রমী হ্যান্ডলিং, স্যান্ডবক্স, জিসি
আলেকজান্ডার মালাখভ

উত্তর:


102

ফ্রেম পয়েন্টার হ'ল একটি রেফারেন্স পয়েন্টার যা কোনও একক ধ্রুবক অফসেটের সাথে কোনও স্থানীয় ভেরিয়েবল বা যুক্তি কোথায় রয়েছে তা ডিবাগারকে জানতে দেয়। যদিও মৃত্যুদন্ডের সময় ESP এর মান পরিবর্তিত হয়, একই অফসেটে একই ভেরিয়েবলের কাছে পৌঁছানো সম্ভব EBP একই থাকে (যেমন প্রথম প্যারামিটার সর্বদা EBP + 8 এ থাকবে যখন আপনি চাপ দিচ্ছেন তাই ইএসপি অফসেটগুলি উল্লেখযোগ্যভাবে পরিবর্তন করতে পারে) / পপিং জিনিসগুলি)

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

গ্রেগ যেমন উল্লেখ করেছেন, এটি ডিবাগারটির জন্য অনাবন্ধকে স্ট্যাক করতে সহায়তা করে যেহেতু ইবিপি স্ট্যাক ফ্রেমের বিপরীত লিঙ্কযুক্ত তালিকা সরবরাহ করে তাই ডিবাগটিকে স্ট্যাক ফ্রেমের আকার (স্থানীয় ভেরিয়েবল + আর্গুমেন্ট) নির্ধারণ করতে দেয়।

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


10
সংকলক সম্ভবত জানেন যে এটি ইএসপিতে কী করে। অন্যান্য পয়েন্টগুলি বৈধ, যদিও, +1
এরিক্ক্যালেন

8
আধুনিক ডিবাগারগুলি সংকলিত কোডে এমনকি স্ট্যাক ব্যাকট্রেসও করতে পারে -fomit-frame-pointer। সাম্প্রতিক জিসিসিতে সেটিংসটি ডিফল্ট।
পিটার কর্ডেস

4
@ সেদাতকাপানোগলু: একটি তথ্য বিভাগ প্রয়োজনীয় তথ্য রেকর্ড করেছে: yosefk.com/blog/…
পিটার

4
@ সেদাতকাপানোগলু: .eh_frame_hdrবিভাগটি রানটাইম ব্যতিক্রমগুলির জন্যও ব্যবহৃত হয়। আপনি এটা (সঙ্গে পাবেন objdump -hএকটি Linux সিস্টেমে সবচেয়ে বাইনেরিতে), এটা জন্য 16K সম্বন্ধে /bin/bash, গনুহ জন্য 572B বনাম /bin/trueজন্য, 108k ffmpeg। এটি তৈরি করতে অক্ষম করার জন্য একটি গিসি বিকল্প রয়েছে, তবে এটি একটি "সাধারণ" ডেটা বিভাগ, কোনও ডিবাগ বিভাগ নয় যা stripডিফল্টরূপে মুছে ফেলা হয়। অন্যথায় আপনি একটি লাইব্রেরি ফাংশনটি ব্যাকট্র্যাস করতে পারবেন না যেখানে ডিবাগ প্রতীক নেই। এই বিভাগটি push/mov/popপরিবর্তিত নির্দেশাবলীর চেয়ে বড় হতে পারে , তবে এটির শূন্য রানটাইম ব্যয় রয়েছে (যেমন ইউওপ ক্যাশে)।
পিটার কর্ডস 25:38

4
"যেমন প্রথম প্যারামিটার সর্বদা EBP-4 এ থাকবে" সম্পর্কিত: EBP + 8 (x86 এ) এ প্রথম পরামিতিটি নয়?
আয়দিন কে।

31

ইতিমধ্যে ভাল উত্তরে আমার দুটি সেন্ট যুক্ত করুন।

স্ট্যাক ফ্রেমের একটি শৃঙ্খল থাকা এটি একটি ভাল ভাষার আর্কিটেকচারের অংশ। বিপি বর্তমান ফ্রেমের দিকে নির্দেশ করে, যেখানে সাব্রোটিন-লোকাল ভেরিয়েবলগুলি সংরক্ষণ করা হয়। (স্থানীয়রা নেতিবাচক অফসেটগুলিতে রয়েছে এবং যুক্তিগুলি ইতিবাচক অফসেটে রয়েছে))

এটি একটি নিখুঁতভাবে ভাল নিবন্ধটিকে অপ্টিমাইজেশনে ব্যবহার করা থেকে বিরত করছে এই ধারণাটি প্রশ্ন উত্থাপন করে: কখন এবং কোথায় অপ্টিমাইজেশন আসলে সার্থক?

1) ফাংশনগুলি কল না করে এমন কড়া লুপগুলিতে অপ্টিমাইজেশানটি সার্থক is এটি সাধারণত সামগ্রিক কোডের খুব ছোট একটি ভগ্নাংশ, বিশেষত বৃহত সিস্টেমে।

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

আমি জানি আপনি এটি জিজ্ঞাসা করেননি, তবে আমার অভিজ্ঞতায়, 99% পারফরম্যান্স সমস্যার সংকলক অপ্টিমাইজেশানের সাথে কিছুই করার নেই। ওভার-ডিজাইনের সাথে তাদের সবকিছু করার আছে।


ধন্যবাদ @ মাইকে, আমি আপনার উত্তরটি খুব সহায়ক বলে মনে করেছি।
ষাট ফুটারসুডে

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

@ অগুরার: স্থির। ধন্যবাদ আমি নিজেই ব্যাকরণের কিছুটা ভাঙা আছি :)
মাইক ডুনলাভে

4
@ অগুরার ল্যাঙ্গুয়েজটি বিকশিত হয়েছে: "প্রশ্ন শুরু করে" এর অর্থ এখন "প্রশ্ন উত্থাপন"। পুরানো ব্যবহারের জন্য একটি প্রেসক্রিটিভ nitpicker হয়ে কিছুই যোগ করে না।
ব্যবহারকারী 3364825

9

এটি অবশ্যই সংকলকের উপর নির্ভর করে। আমি x86 সংকলক দ্বারা নির্গত অপ্টিমাইজড কোড দেখেছি যা সাধারণ উদ্দেশ্য রেজিস্টার হিসাবে নিঃশব্দে ইবিপি রেজিস্টার ব্যবহার করে। (তবে কোন সংকলকটি আমি এটির সাথে লক্ষ্য করেছি তা মনে নেই))

সংযোজনকারীরা ব্যতিক্রম হ্যান্ডলিংয়ের সময় স্ট্যাক আনওয়ানডিংয়ের সহায়তা করতে ইবিপি রেজিস্টার বজায় রাখতেও বেছে নিতে পারে, তবে এটি আবার সঠিক সংকলক বাস্তবায়নের উপর নির্ভর করে।


-fomit-frame-pointerযখন অপ্টিমাইজেশন সক্ষম থাকে তখন বেশিরভাগ সংকলকগণ ডিফল্ট হয় । (যখন এবিআই এটির অনুমতি দেয়)। জিসিসি, ঝনঝন, আইসিসি, এবং এমএসভিসি সবাই এটি করে, আইআইআরসি, এমনকি 32-বিট উইন্ডোজকে লক্ষ্য করেও। হ্যাঁ, আমার উত্তরটি কেন স্ট্যাকের পরামিতিগুলি সনাক্ত করতে esp রেজিস্ট্রারের চেয়ে ebp ব্যবহার করা ভাল? দেখায় যে এমনকি 32-বিট উইন্ডোজ ফ্রেম পয়েন্টারটিকে বাদ দিতে পারে। 32-বিট x86 লিনাক্স অবশ্যই করতে পারে এবং করতে পারে। এবং অবশ্যই -৪-বিট ABIs শুরু থেকেই ফ্রেম-পয়েন্টার বাদ দেওয়ার অনুমতি দিয়েছে।
পিটার কর্ডস

4

তবে, x86 এর খুব কম রেজিস্টার রয়েছে

এটি কেবলমাত্র সেই অর্থেই সত্য যে অপকডগুলি কেবলমাত্র 8 টি নিবন্ধকে সম্বোধন করতে পারে। প্রসেসর নিজেই এর চেয়ে অনেক বেশি রেজিস্টার থাকতে পারে এবং এই সীমাটি পেতে রেজিস্ট্রার নামকরণ, পাইপলাইনিং, অনুমানমূলক এক্সিকিউশন এবং অন্যান্য প্রসেসরের বুজওয়ার্ড ব্যবহার করে। উইকিপিডিয়ায় একটি রেজিস্টার সীমা অতিক্রম করতে এক্স x86 প্রসেসর কী কী করতে পারে তার একটি প্রাথমিক পরিচয় অনুচ্ছেদে রয়েছে: http://en.wikedia.org/wiki/X86#C اوس_mplementations


4
মূল প্রশ্নটি উত্পন্ন কোড সম্পর্কিত, যা ওপকডগুলি দ্বারা উল্লেখযোগ্য রেজিস্টারগুলিতে কঠোরভাবে সীমাবদ্ধ।
ড্যারন

4
হ্যাঁ, তবে এই কারণেই আজকাল অনুকূলিত বিল্ডগুলিতে ফ্রেম পয়েন্টার বাদ দেওয়া ততটা গুরুত্বপূর্ণ নয়।
মাইকেল 21

4
নিবন্ধভুক্ত নামকরণ আসলে একইভাবে বৃহত সংখ্যক রেজিস্ট্রার পাওয়া থাকার মতো নয়। এখনও প্রচুর পরিস্থিতি রয়েছে যেখানে রেজিস্ট্রার নামকরণে কোনও লাভ হয় না, তবে আরও "নিয়মিত" নিবন্ধগুলি থাকে।
jalf

1

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

খাঁটি রেজিস্টারে আপনি কতটা সঞ্চয় করছেন? এটা কি মূল্য?


নির্দেশাবলী এনকোডিংয়ের মাধ্যমে আরও নিবন্ধগুলি সীমাবদ্ধ। x86-64 এসআরসি উপসর্গ বাইটে বিট ব্যবহার করে এসসিআর এবং ডেস্ট রেজিস্টারগুলির জন্য নির্দেশাবলীর 3 থেকে 4 বিট অংশের নির্দেশাবলীর নির্দিষ্ট অংশ প্রসারিত করতে। যদি ঘরটি থাকত, x86-64 সম্ভবত 32 টি আর্কিটেকচারাল রেজিস্টারে গিয়েছিল, যদিও সংরক্ষণ / পুনরুদ্ধার করা প্রসঙ্গে যে অনেকগুলি স্যুইচগুলি যুক্ত হতে শুরু করে। 15 হ'ল একটি বিশাল পদক্ষেপ 7 থেকে, তবে 31 বেশিরভাগ ক্ষেত্রেই এর চেয়ে ছোট উন্নতি। (স্ট্যাক পয়েন্টারটিকে সাধারণ-উদ্দেশ্য হিসাবে গণনা করা হচ্ছে না) কেবল স্ট্যাক ফ্রেমের চেয়ে আরও বেশি ধাক্কা / পপ দ্রুত করা দুর্দান্ত। যদিও এটি # টি রেগ সহ কোনও ট্রেড অফ নয়।
পিটার কর্ডস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.