x87 मशीन कोड, 11 बाइट्स
D9 EB
DA 31
D9 F2
DD D8
DA 09
C3
कोड के ऊपर बाइट्स एक फ़ंक्शन को परिभाषित करता है जो 1. के एपोटेम के साथ एक नियमित एन-गॉन के क्षेत्र की गणना करता है। यह गणना करने के लिए x87 FPU निर्देशों (x86 प्रोसेसर पर क्लासिक फ्लोटिंग-पॉइंट यूनिट) का उपयोग करता है।
मानक x86 रजिस्टर-आधारित कॉलिंग कन्वेंशन (इस मामले में __fastcall) के बाद, फ़ंक्शन का तर्क पूर्णांक के लिए एक संकेतक है, जो ECXरजिस्टर में पास किया गया है । फ़ंक्शन का परिणाम एक फ्लोटिंग-पॉइंट वैल्यू है, जो x87 फ्लोटिंग-पॉइंट स्टैक (रजिस्टर ST0) के शीर्ष पर लौटा है ।
इसे ऑनलाइन आज़माएं!
असेंबली असेंबली mnemonics:
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 * tan (
Only / n) केवल कुछ दिलचस्प बातें बताते हैं:
- X87 FPU में स्थिर मान PI (
FLDPI) लोड करने के लिए एक समर्पित निर्देश है । यह शायद ही कभी इस्तेमाल किया गया था, यहां तक कि दिन में वापस (और जाहिर तौर पर अब तक बहुत कम है), लेकिन यह आपके बाइनरी में एक स्थिरांक को एम्बेड करने और उसे लोड करने की तुलना में आकार में छोटा है।
- X87 FPU निर्देश स्पर्शरेखा की गणना करने के लिए
FPTAN, परिणाम के साथ इनपुट रजिस्टर (FPU स्टैक के शीर्ष) के मूल्य को बदलता है, लेकिन FPU स्टैक के शीर्ष पर एक निरंतर 1.0 को भी धक्का देता है। यह 8087 के साथ पीछे की संगतता के लिए किया गया है (मुझे नहीं पता कि यह 8087 पर क्यों किया गया था; शायद एक बग)। इसका मतलब है कि हमें स्टैक से इस अनावश्यक मान को पॉप करने की आवश्यकता है। ऐसा करने का सबसे तेज़ और सबसे छोटा तरीका एक सरल है FSTP st0, जैसे हम यहाँ उपयोग करते हैं। हम एक बहु-और-पॉप भी कर सकते थे , क्योंकि 1.0 से गुणा करने से परिणाम नहीं बदलेगा, लेकिन यह 2 बाइट्स भी है (इसलिए कोड आकार में कोई जीत नहीं), शायद अधिक धीरे-धीरे निष्पादित करेगा, और अनावश्यक अनिश्चितता का परिचय दे सकता है परिणाम।
हालांकि एक आधुनिक प्रोग्रामर या कंपाइलर SSE (और बाद में) निर्देश सेट का उपयोग करेगा, उम्र बढ़ने के x87 के बजाय, इसे लागू करने के लिए अधिक कोड की आवश्यकता होगी, क्योंकि इन नए ISAs में एक स्पर्शरेखा की गणना करने के लिए कोई एकल निर्देश नहीं है।
Area@RegularPolygonहोना चाहिएArea@*RegularPolygon; जैसा कि अभी है, इसे एक चर में कैद नहीं किया जा सकता है। यानीf = Area@RegularPolygon; f[3]काम नहीं करता। प्रासंगिक मेटा चर्चा