নির্বাচন চার x64 উপর যুক্তি রেজিস্টার - ইউনিক্স / Win64 সাধারণ
X86 সম্পর্কে মনে রাখার একটি বিষয় হ'ল "রেজি নম্বর" এনকোডিংয়ের নিবন্ধের নাম সুস্পষ্ট নয়; নির্দেশনা এনকোডিংয়ের শর্তাবলী ( এমওডি আর / এম বাইট, দেখুন http://www.c-jump.com/CIS77/CPU/x86/X77_0060_mod_reg_r_m_by_.htm ), নম্বরগুলি নিবন্ধ করুন ... 7 - এই ক্রমে - ?AX
, ?CX
, ?DX
, ?BX
, ?SP
, ?BP
, ?SI
, ?DI
।
সুতরাং প্রত্যাবর্তনের মান এবং প্রথম দুটি আর্গুমেন্ট (যা "ধ্রুপদী" 32 বিট __fastcall
কনভেনশন) এর জন্য এ / সি / ডি (নিয়মিত 0..2 ) নির্বাচন করা একটি যৌক্তিক পছন্দ। যতদূর bit৪ বিবিটে যাওয়ার কথা, "উচ্চতর" রেগ অর্ডার করা হয় এবং মাইক্রোসফ্ট এবং ইউএন * এক্স / লিনাক্স উভয়ই প্রথম হিসাবে R8
/ R9
হিসাবে যায়।
মনে রাখা যে, মাইক্রোসফট পছন্দের RAX
(ফেরত মান) এবং RCX
, RDX
, R8
, R9
(ARG [0..3]) একটি বোধগম্য নির্বাচন যদি আপনি নির্বাচন হয় চার আর্গুমেন্ট জন্য রেজিস্টার।
আমি জানি না কেন আগে AMD64 UN * X ABI বেছে RDX
নিয়েছিল RCX
।
এক্স on৪ - ইউএন * এক্স-এর জন্য ছয়টি যুক্তি নিবন্ধগুলি নির্বাচন করা
ইউএন * এক্স, আরআইএসসি আর্কিটেকচারে, রেজিস্টারগুলিতে traditionতিহ্যগতভাবে যুক্তিগুলি পাস করেছেন - বিশেষত প্রথম ছয়টি যুক্তির জন্য (এটি পিপিসি, স্পার্ক, এমআইপিএস অন্তত)। যা এএমডি 64৪ (ইউএন * এক্স) এবিআই ডিজাইনাররা সেই আর্কিটেকচারে ছয়টি রেজিস্ট্রার ব্যবহার করার জন্য কেন বেছে নেওয়ার অন্যতম কারণ হতে পারে।
তাই আপনি যদি চান ছয় নিবন্ধনের আর্গুমেন্ট পাস, এবং এটা পছন্দ করে নিন লজিক্যাল এর RCX
, RDX
, R8
এবং R9
তাদের মধ্যে চার, এর জন্য অন্যান্য দুটি যা আপনি বাছাই করা উচিত?
এগুলি নির্বাচন করার জন্য "উচ্চতর" রেগুলিকে অতিরিক্ত নির্দেশের উপসর্গের বাইটের প্রয়োজন হয় এবং অতএব আরও বড় নির্দেশের আকারের পদচিহ্ন থাকে, সুতরাং আপনার যদি বিকল্প থাকে তবে আপনি সেগুলির মধ্যে কোনওটিই বেছে নিতে চান না। শাস্ত্রীয় নিবন্ধগুলির মধ্যে, এর অন্তর্নিহিত অর্থের কারণে RBP
এবং RSP
এগুলি উপলভ্য নয় এবং RBX
traditionতিহ্যগতভাবে ইউএন * এক্স (গ্লোবাল অফসেট টেবিল) -এ একটি বিশেষ ব্যবহার রয়েছে যা আপাতদৃষ্টিতে এএমডি A৪ এবিআই ডিজাইনার অকারণে বেমানান হতে চাননি।
কিন্তু, একমাত্র পছন্দ ছিল RSI
/ RDI
।
সুতরাং আপনার যদি আর্গুমেন্ট রেজিস্ট্রার হিসাবে RSI
/ নিতে হয় তবে RDI
তাদের কোন যুক্তি হওয়া উচিত?
তাদের মেকিং arg[0]
এবং arg[1]
কিছু সুফল রয়েছে। সিএইচওর মন্তব্য দেখুন।
?SI
এবং ?DI
স্ট্রিং ইন্সট্রাকশন সোর্স / গন্তব্য অপারেশনস এবং সিএইচও যেমন উল্লিখিত হয়েছে, তাদের আর্গুমেন্ট রেজিস্টার হিসাবে ব্যবহারের অর্থ AMD64 ইউএন * এক্স কলিং কনভেনশনগুলির সাথে, সহজতম strcpy()
ফাংশন, উদাহরণস্বরূপ, কেবলমাত্র দুটি সিপিইউ নির্দেশাবলী নিয়ে থাকে repz movsb; ret
কারণ উত্স / লক্ষ্য ফোনকারী ঠিকানাগুলি সঠিক রেজিস্টারে রেখেছেন। বিশেষত নিম্ন-স্তরের এবং সংকলক-উত্পাদিত "আঠালো" কোডে রয়েছে (উদাহরণস্বরূপ, কিছু সি ++ হিপ বরাদ্দকারী নির্মাণে শূন্য-ফিলিং বস্তু বা কার্নেল শূন্য-পূরণের হিপ পৃষ্ঠাগুলি রয়েছে)sbrk()
, বা অনুলিপি-লিখিত পেজফাল্টগুলি) বিপুল পরিমাণে অনুলিপি অনুলিপি / পূরণ করুন, সুতরাং দুটি বা তিনটি সিপিইউ নির্দেশনা সংরক্ষণ করার জন্য এটি কোডের জন্য প্রায়শই ব্যবহৃত হবে যা অন্যথায় এ জাতীয় উত্স / লক্ষ্য ঠিকানা যুক্তিগুলি লোড করবে the "সঠিক" নিবন্ধগুলি।
তাই একটি উপায়, জাতিসংঘের * X এবং Win64 যে ইউনিক্স "prepends" দুটি অতিরিক্ত আর্গুমেন্ট, উদ্দেশ্যপূর্ণ মনোনীত একমাত্র ভিন্ন RSI
/ RDI
রেজিস্টার, চার আর্গুমেন্ট প্রাকৃতিক পছন্দের RCX
, RDX
, R8
এবং R9
।
যে অতিক্রম ...
ইউএন * এক্স এবং উইন্ডোজ x64 এবিআই-এর মধ্যে নির্দিষ্ট রেজিস্টারগুলিতে যুক্তিগুলির ম্যাপিংয়ের চেয়ে আরও বেশি পার্থক্য রয়েছে। উইন 64 এ পর্যালোচনার জন্য, পরীক্ষা করুন:
http://msdn.microsoft.com/en-us/library/7kcdt6fy.aspx
উইন 64৪ এবং এএমডি UN৪ ইউএন * এক্স স্ট্যাকস্পেস ব্যবহারের পদ্ধতিতেও উল্লেখযোগ্যভাবে পৃথক; উইন on৪ তে, উদাহরণস্বরূপ, কলকারীকে অবশ্যই আর্গুমেন্টগুলির জন্য স্ট্যাকস্পেস বরাদ্দ করতে হবে যদিও নিবন্ধগুলিতে 0 ... 3 পাস করা হয়েছে passed অন্যদিকে ইউএন * এক্স-তে, একটি পাতার ফাংশন (যেমন একটি যা অন্য ফাংশনগুলিকে ডাকে না) এমনকি স্ট্যাকস্পেস বরাদ্দ করার প্রয়োজন নেই এমনকি যদি এটির 128 বাইটের বেশি প্রয়োজন না হয় (হ্যাঁ, আপনি নিজের এবং এটি ব্যবহার করতে পারেন) এটিকে বরাদ্দ না করেই একটি নির্দিষ্ট পরিমাণের স্ট্যাক ... ভাল, যদি না আপনি কার্নেল কোড হন, নিফ্টি বাগের উত্স)। এগুলি সমস্ত নির্দিষ্ট অপ্টিমাইজেশনের পছন্দ, মূল পোস্টারের উইকিপিডিয়া রেফারেন্সটি নির্দেশ করে যেগুলির জন্য বেশিরভাগ যুক্তি পূর্ণ এবিআই রেফারেন্সে ব্যাখ্যা করা হয়েছে।