2010-12-27 12 views
5

एक GNU परियोजना में कुछ स्रोत कोड के माध्यम से पढ़ते समय, मैं इनलाइन विधानसभा के इस बिट में आए:सहायता 86 इनलाइन विधानसभा में समझ DIV अनुदेश

__asm__ (
    "divq %4" 
    : "=a" (q), "=d" (r) 
    : "0" (n0), "1" (n1), "rm" (d) 
); 

यहाँ चर q, r, n0, n1, और d 64-बिट पूर्णांक हैं। मुझे यह पता लगाने के लिए पर्याप्त असेंबली पता है कि यह क्या करता है, लेकिन कुछ विवरण हैं जिनके बारे में मैं निश्चित नहीं हूं।

मैं क्या समझ:

हम d द्वारा RAX रजिस्टर की सामग्री को विभाजित कर रहे हैं q में भागफल रखने, और r में शेष का मौक़ा मिला।

मैं क्या समझ में नहीं आता

  1. क्यों तीन आदानों यहाँ हैं? हमें केवल लाभांश और एक विभाजक इनपुट करने की आवश्यकता है, तो का उपयोग 3 इनपुट के लिए क्या हो सकता है?
  2. मैं नहीं बता सकता कि कौन से इनपुट लाभांश हैं। अधिक आम तौर पर, मुझे वास्तव में कुछ भी नहीं दिखता है आरएक्स रजिस्टर, में लोड किया जा रहा है, तो यह कैसे पता चलेगा कि क्या विभाजित करना है?
+1

+1 अच्छी तरह से फ़ॉर्मेटेड प्रश्न। मुझे "जो मैं समझता हूं" और "जो मैं समझ नहीं पा रहा हूं" अनुभाग पसंद करता हूं। –

उत्तर

4

इनपुट ऑपरेंड विनिर्देश में:

: "0" (n0), "1" (n1), "rm" (d) 

रजिस्टरों "0" और "1" उत्पादन विनिर्देश की वजह से rdxrax करने के लिए मजबूर कर रहे हैं और:

: "=a" (q), "=d" (r) 

और div अनुदेश परिवार चाहता है RDX:RAX में अंकक। Divisor एक सामान्य प्रयोजन रजिस्टर में हो सकता है (अन्यथा उपयोग नहीं किया जाता है - यानी, RAX या RDX) या स्मृति, जो "आरएम" बाधा द्वारा निर्दिष्ट है। रजिस्टर्स RDX, RAX, और विभाजक ऑपरेंड 3 इनपुट बनाते हैं।

तो यह विभाजन को समाप्त कर देगा: n1:n0/d जहां n1:n0rdx:rax में लोड की गई मात्रा है।

+0

क्या मैं सही ढंग से समझता हूं कि इसका उपयोग 64 बिट पूर्णांक द्वारा 128 बिट पूर्णांक को विभाजित करने के लिए किया जा सकता है? मुझे पता था कि यह 32 बिट रजिस्टर संस्करण के लिए संभव था, लेकिन कभी सोचा नहीं था कि यह 64 बिट संस्करण के लिए भी होगा। –

+1

@ जेन्स: यह सही है।लेकिन याद रखें कि (छोटे ऑपरेंड डिवीजन ऑपरेशंस की तरह) यदि 'रैक्स' गंतव्य रजिस्टर के लिए उद्धरण बहुत बड़ा हो जाता है तो आपको एक विभाजन अपवाद मिलेगा। –

+1

इस मामले के लिए परीक्षण करने का त्वरित तरीका यह सुनिश्चित करना है कि 'rdx' divisor से कम है, जिस स्थिति में विभाजन सुरक्षित है। –

0

आप सही तरीके से पालन के रूप में div परिवार तय रजिस्टरों a और d, rax और divq के लिए rdx पर काम करता है। a रजिस्टर n0 से अपना इनपुट प्राप्त करता है जो 0 वें रजिस्टर, a पर आधारित है। n1d पर एक डमी इनपुट है, शायद यह सुनिश्चित करने के लिए कि यह रजिस्टर अन्य उद्देश्यों के लिए उपयोग नहीं किया गया है।