2011-11-13 13 views
7

मुझे यहां एक बहुत ही बुनियादी संदेह है।असेंबलर में, रजिस्टरों का उपयोग अतिरिक्त और घटाव के बीच क्यों भिन्न होता है?

कार्यक्रम 1:

main() 

{ 

    int temp1, temp2, temp3; 
    char temp5, temp6, temp7, temp8, temp9; 
    temp1 = 5; 
    temp1 = 9 - temp1; 
} 

विधानसभा:

0x080483b4 <+0>: push ebp  
    0x080483b5 <+1>: mov ebp,esp  
    0x080483b7 <+3>: sub esp,0x20  
    0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5  
    0x080483c1 <+13>: mov eax,0x9  
    0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc]  
    0x080483c9 <+21>: mov DWORD PTR [ebp-0xc],eax  
    0x080483cc <+24>: leave  
    0x080483cd <+25>: ret 

कार्यक्रम 2:

main()  
{  
    int temp1, temp2, temp3; 
    char temp5, temp6, temp7, temp8, temp9; 
    temp1 = 5; 
    temp1 = 9 + temp1;  
} 

विधानसभा:

मैं दो बहुत ही सरल सी कोड और उनके विधानसभा कोड है
0x080483b4 <+0>: push ebp  
    0x080483b5 <+1>: mov ebp,esp  
    0x080483b7 <+3>: sub esp,0x20  
    0x080483ba <+6>: mov DWORD PTR [ebp-0xc],0x5  
    0x080483c1 <+13>: add DWORD PTR [ebp-0xc],0x9  
    0x080483c5 <+17>: leave  
    0x080483c6 <+18>: ret 

घटाव के मामले में, ईएक्स रजिस्टर का उपयोग करने की आवश्यकता है और अतिरिक्त के मामले में नहीं। नहीं ऐसा किया जा सकता है:

0x080483c1 <+13>: sub DWORD PTR [ebp-0xc],0x9 

बजाय -

0x080483c1 <+13>: mov eax,0x9 

0x080483c6 <+18>: sub eax,DWORD PTR [ebp-0xc] 
+0

संख्या। सी कोड में, आप 9 से एक चर घटा रहे हैं। आपकी असेंबली में आपको 9 से एक रजिस्टर घटाया जाना चाहिए, जो असेंबली कोड का है और उप डीडब्ल्यूओआर पीटीआर [ईबीपी -0xc], 0x9 नहीं है। असेंबली कोड पर, ईएक्स 5 के साथ घटाया जाता है। आपके आधार पर, आप 9 के साथ 5 घटा रहे हैं। –

+0

क्या आपने ऑप्टिमाइज़ेशन के साथ संकलित किया है? – ninjalj

+0

@ निंजलज: जाहिर है कि उसने नहीं किया। क्योंकि अन्यथा पूरी चीज निश्चित रूप से एक 'ret' के लिए अनुकूलित की गई होगी। – celtschk

उत्तर

10

क्योंकि इसके विनिमेय है मेरा अनुमान है कि (ए + बी == बी + एक), जबकि घटाव नहीं है (ए - बी! = बी - ए)। इस वजह से 9 + temp1 का जोड़ा temp1 + 9 जैसा है, इसलिए सरल असेंबलर अनुक्रम। 9 - temp1 में एक अस्थायी चर बनाने शामिल है।

+4

आप का मतलब कम्यूटेटिव है: सहयोगी साधन * (ए + बी) + सी == ए + (बी + सी) * – Christoph

+4

मैंने वास्तव में क्रिस्टोफ किया, मेरे पिछले गणित वर्ग के दो दशकों और इसके बाद दो और बीयर। –

2

temp1 = 9 - temp1;temp1 = - temp1 + 9; जैसा ही है।

  1. नकारना temp1
  2. अलावा

eax बीच मूल्य को बचाने के लिए अस्थायी स्थान के रूप में प्रयोग किया जाता है क्या: यह 2 संचालन किया जाता है।

इसके अतिरिक्त, कोई "मध्यम मूल्य" नहीं है, ऑपरेशन सीधे किया जा सकता है।

+0

यह उत्तर इस बात में नहीं बताया गया है कि प्रश्न में क्या पूछा जा रहा है। इसके अलावा, असेंबली कोड में एक निषेध निर्देश नहीं है। – Nayuki

2

मनाया व्यवहार के लिए वास्तविक कारण अन्य उत्तर से गर्भित किया गया है, लेकिन स्पष्ट रूप से उल्लेख नहीं:

%register := %register + $immediate [1] 
%register := %register - $immediate [2] 
commutativity की वजह से

, [1]:

आम निर्देश सेट निम्नलिखित संगणना के लिए ऑप्स की सुविधा भी गणना करने के लिए

%register := $immediate + %register 

हालांकि,

के लिए एक समर्पित सेशन इस्तेमाल किया जा सकता
%register := $immediate - %register 

उपलब्ध नहीं है, जो यह नकल करते जा करने के लिए किया गया है, अनुक्रम

%temp  := %register 
%register := $immediate 
%register := %register - %temp 
1

कारण 86 अनुदेश सेट में समरूपता की कमी है, जो एक शामिल नहीं है द्वारा जैसे मतलब है सामान्य रूप में है निरंतर से एक रजिस्टर घटाने के लिए निर्देश।

उदाहरण के लिए, एआरएम निर्देश सेट में इस उद्देश्य के लिए RSB (रिवर्स SuBtract) निर्देश शामिल है।

+0

असल में एआरएम निर्देश सेट इस मामले में गैर सममित है - इसमें एक (निश्चित रूप से बेकार) 'रिवर्स एड' निर्देश की कमी है, जहां इस मामले में x86 सममित है - इसमें दोनों निर्देशों, उपयोगी रिवर्स घटाव और बेकार रिवर्स अतिरिक्त । इसके लिए गहरा कारण (और एक रिवर्स उप की आवश्यकता) निश्चित रूप से घटाव में समरूपता की कमी है - यह कम्यूटिव नहीं है। – hirschhornsalz

+0

इस मामले में समरूपता घटाव करने के दो तरीकों के बीच है। – starblue

+1

संयोग से, पीआईसी ब्रांड माइक्रोकंट्रोलर के पास 'निरंतर डब्ल्यू से निरंतर' निर्देश होता है, लेकिन कोई भी 'डब्ल्यू रजिस्टर से निरंतर घटता नहीं है', क्योंकि बाद के निर्देश को 256-स्थिर जोड़कर अनुकरण किया जा सकता है। – supercat

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