मुझे यहां एक बहुत ही बुनियादी संदेह है।असेंबलर में, रजिस्टरों का उपयोग अतिरिक्त और घटाव के बीच क्यों भिन्न होता है?
कार्यक्रम 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]
संख्या। सी कोड में, आप 9 से एक चर घटा रहे हैं। आपकी असेंबली में आपको 9 से एक रजिस्टर घटाया जाना चाहिए, जो असेंबली कोड का है और उप डीडब्ल्यूओआर पीटीआर [ईबीपी -0xc], 0x9 नहीं है। असेंबली कोड पर, ईएक्स 5 के साथ घटाया जाता है। आपके आधार पर, आप 9 के साथ 5 घटा रहे हैं। –
क्या आपने ऑप्टिमाइज़ेशन के साथ संकलित किया है? – ninjalj
@ निंजलज: जाहिर है कि उसने नहीं किया। क्योंकि अन्यथा पूरी चीज निश्चित रूप से एक 'ret' के लिए अनुकूलित की गई होगी। – celtschk