के साथ तुलना में मैं वर्तमान में असेंबली और सी प्रोग्रामिंग भाषा सीख रहा हूं और मेरे पास इसके बारे में कुछ प्रश्न हैं।असेंबली सी कोड
सी कोड
int arith(int x, int y, int z) {
int t1 = x + y;
int t2 = z*48;
int t3 = t1 & 0xFFFF;
int t4 = t2 * t3;
return t4;
}
विधानसभा कोड
movl 16(%ebp),%eax z
leal (%eax,%eax,2), %eax z*3
sall $4,%eax t2 = z*48
movl 12(%ebp),%edx y
addl 8(%ebp),%edx t1 = x+y
andl $65535,%edx t3 = t1&0xFFFF
imull %edx,%eax Return t4 = t2*t3
इसके बजाय लील का उपयोग कर और फिर 4 से स्थानांतरण 48 से जेड गुणा करने के लिए, मैं सिर्फ $ 48,% eax imull इस्तेमाल कर सकते हैं की
?
इसके अलावा, यह कई बार% edx रजिस्टर का उपयोग कर रहा है। क्या इसका मतलब है कि टी 1 ओवरराइट किया जा रहा है? दूसरे शब्दों में, क्या मैं अभी भी टी 4 से पहले टी 1 को पुनः प्राप्त कर पाऊंगा यदि मैं चाहता था?
हां, नहीं (चर 'टी 1' को अनुकूलित किया गया है), और नहीं। आखिरी प्रश्न' x + y' की गणना की जाती है लेकिन कभी नहीं सहेजी जाती है। _EDX_ के पास 'एडीएल 8 (% ईबीपी),% edx' के बाद मान' x + y' था लेकिन निर्देश 'और $ 65535,% edx' इसे नष्ट कर देता है। यदि आपने _EDX_ को _ECX_ जैसे किसी एडीएल 8 (% ईबीपी),% edx' के बाद स्थानांतरित किया है तो आपको अभी भी गणना के x + y भाग तक पहुंच होगी। –
कूल। सी कोड वास्तव में इस तरह के दृश्यों के पीछे अनुवादित किया जाएगा कि यह प्रत्येक चर को अपने रजिस्टर में स्टोर नहीं करेगा? – Dylan
यदि इसकी आवश्यकता नहीं है तो नहीं। यह एक अनुकूल संकलक की शक्ति है। – usr2564301