2015-12-16 4 views
5

कोई बता सकता है कि निम्न कोड क्या करता है?यह x86 असेंबली निर्देश क्या करता है (जोड़ा xmm0, डीएस: __ xmm @ 41f00000000000000000000000000000 [edx * 8])?

addsd xmm0, ds:[email protected][edx*8] 

मैं लगा कि कुछ मूल्य रजिस्टर xmm0 फ्लोट करने के लिए जोड़ा जाता है, लेकिन __xmm का अर्थ @ 41f00000000000000000000000000000 निरंतर क्या है? क्या कोई दस्तावेज है जहां मैं इसके बारे में पढ़ सकता हूं?

यहाँ है कि मैं समझने की कोशिश कर रहा हूँ कोड का पूरा टुकड़ा है:

cvtsi2sd xmm0, [ebp+var_2C8] 
mov  edx, [ebp+var_2C8] 
shr  edx, 1Fh 
addsd xmm0, ds:[email protected][edx*8] 

ईबीपी + var_2C8 अहस्ताक्षरित पूर्णांक मान है।

  1. ईबीपी + var_2C8 फ्लोट करने के लिए परिवर्तित और xmm0 रजिस्टर करने के लिए
  2. ईबीपी ले जाया + var_2C8 EDX और सही 31 बिट
  3. कुछ इस स्थानांतरण से प्राप्त द्वारा स्थानांतरित करने के लिए ले जाया जाता है है xmm0 में जोड़ा जाता है।

xmm0 में वास्तव में क्या जोड़ा गया है? क्या इस गणना के लिए कोई संभावित उद्देश्य है?

अद्यतन।
यहाँ इस कोड के लिए कच्चे disassembly है:

cvtsi2sd xmm0,dword ptr [ebp-2C8h] 
mov   edx,dword ptr [ebp-2C8h] 
shr   edx,1Fh 
addsd  xmm0,mmword ptr [edx*8+2685CC0h] 

लगता स्थिरांक की सरणी से कुछ डबल मूल्य की तरह xmm0 में जोड़ा जाता है ...

+2

यह एक लुकअप टेबल या सरणी है। मूर्खतापूर्ण स्थिरता केवल आपके डिस्सेबलर का एक उत्पाद है (एक प्रतीक भी हो सकता है), वास्तविक पता देखने के लिए कच्चे डिस्सेप्लर को देखें। – Jester

उत्तर

9

इस अहस्ताक्षरित पूर्णांक के रूपांतरण को दोगुना करने की है।

यह कैसे काम करता है यह पहले हस्ताक्षर किए के रूप में यह धर्मान्तरित अर्थ संकेत बिट के -2 एक वजन है कि है, लेकिन जहां शीर्ष बिट +2 का वजन है यह अहस्ताक्षरित किया जाना चाहिए। तो यदि हस्ताक्षर सेट किया गया है, तो यह क्षतिपूर्ति के लिए +2 = 4294967296.0 (41f0000000000000 डबल) जोड़ता है। यह सही स्थानांतरित करके, शीर्ष बिट को नीचे की ओर डालने और बाकी सब कुछ साफ़ करने के द्वारा ऐसा करता है, और फिर यह तालिका तालिका के रूप में 0 और 42 9 4 9 67296.0 युक्त तालिका में उपयोग करता है।

+0

इस पूरी व्याख्या के लिए पर्याप्त धन्यवाद नहीं दे सकता! – leo

संबंधित मुद्दे