x87 মেশিন কোড, 11 বাইট
D9 EB
DA 31
D9 F2
DD D8
DA 09
C3
উপরের কোডের বাইটগুলি একটি ফাংশন সংজ্ঞায়িত করে যা একটি নিয়মিত এন-গনের ক্ষেত্রফলকে 1 এর এপোথেম দিয়ে গণনা করে It এটি এই গণনাটি করতে x87 এফপিইউ নির্দেশাবলী (x86 প্রসেসরের ক্লাসিক ভাসমান-পয়েন্ট ইউনিট) ব্যবহার করে।
একটি স্ট্যান্ডার্ড x86 রেজিস্টার-ভিত্তিক কলিং কনভেনশন অনুসরণ করুন (এই ক্ষেত্রে, __fastcall
), ফাংশনের যুক্তিটি পূর্ণসংখ্যার দিকে নির্দেশক, যা ECX
রেজিস্টারে পাস করা হয় । ফাংশনটির ফলাফলটি একটি ভাসমান-পয়েন্টের মান, x87 এর ভাসমান-পয়েন্ট স্ট্যাকের (রেজিস্টার ST0
) শীর্ষে ফিরে আসে ।
এটি অনলাইন চেষ্টা করুন!
অবহেলিত সমাবেশ মেমোনমিক্স:
D9 EB fldpi ; load constant PI at top of FPU stack
DA 31 fidiv DWORD PTR [ecx] ; divide PI by integer input (loaded from pointer
; in ECX), leaving result at top of FPU stack
D9 F2 fptan ; compute tangent of value at top of FPU stack
DD D8 fstp st0 ; pop junk value (FPTAN pushes 1.0 onto stack)
DA 09 fimul DWORD PTR [ecx] ; multiply by integer input (again, loaded via ECX)
C3 ret ; return control to caller
আপনি দেখতে পাচ্ছেন যে এটি মূলত প্রদত্ত সূত্রের কেবল একটি সরল গণনা,
ফলাফল = এন * ট্যান (π / n)
কেবল আকর্ষণীয় বিষয়গুলির মধ্যে দু'টি উল্লেখ করে:
- এক্স 87 এফপিইউতে ধ্রুবক মান পিআই (
FLDPI
) লোড করার জন্য একটি নিবেদিত নির্দেশনা রয়েছে । এটি খুব কমই ব্যবহৃত হয়েছিল, এমনকি দিনে ফিরে (এবং সম্ভবত এখন খুব কম) তবে এটি আপনার বাইনারিটিতে কোনও ধ্রুবককে এম্বেড করা এবং লোড করার চেয়ে আকারে খাটো।
- ক্যালকুলেট স্পর্শক করার x87 FPU নির্দেশ,
FPTAN
, ইনপুট রেজিস্টার (FPU স্ট্যাকের শীর্ষ) ফলাফল নিয়ে মান প্রতিস্থাপন কিন্তু এছাড়াও FPU স্ট্যাকের উপরে সম্মুখের একটি ধ্রুবক 1.0 push কর্মের। এটি 8087 এর সাথে পিছনের সামঞ্জস্যের জন্য করা হয় (কেন আমি 8087 এ এটি করা হয়েছিল তা আমার কোনও ধারণা নেই; সম্ভবত একটি বাগ)। এর অর্থ আমাদের এই অপ্রয়োজনীয় মানটিকে স্ট্যাকের বাইরে পপ করতে হবে। এটি করার দ্রুত এবং সংক্ষিপ্ততম উপায়টি হ'ল একটি সাধারণ FSTP st0
, যেমন আমরা এখানে ব্যবহার করি। আমরা একটি গুণ ও পপও করতে পারতাম , যেহেতু ১.০ দ্বারা গুণ করলে ফলাফল পরিবর্তন হবে না, তবে এটি ২ বাইট (কোডের আকারে কোনও জয় নয়) সম্ভবত আরও ধীরে ধীরে কার্যকর হবে এবং এর মধ্যে অপ্রয়োজনীয় অনির্দিষ্টতার পরিচয় দিতে পারে ফলাফল.
যদিও একজন আধুনিক প্রোগ্রামার বা সংকলক এসআইএসই (এবং পরবর্তী) ইনস্রোডাকশন সেটটি ব্যবহার করবে বয়স্ক x87 এর পরিবর্তে, এটি প্রয়োগের জন্য আরও কোডের প্রয়োজন হবে, কারণ এই নতুন আইএসএগুলিতে ট্যানজেন্ট গণনা করার জন্য একক নির্দেশনা নেই।
Area@RegularPolygon
হওয়া উচিতArea@*RegularPolygon
; এটি এখন যেমন আছে, এটি একটি ভেরিয়েবলের মধ্যে ক্যাপচার করা যায় না। যে,f = Area@RegularPolygon; f[3]
কাজ করে না। প্রাসঙ্গিক মেটা আলোচনা