मैं जीसीसी के इनलाइन असेंबलर का उपयोग कर x86 असेंबली के साथ खुद को परिचित करने की कोशिश कर रहा हूं। मैं दो नंबर (a
और b
) जोड़ने की कोशिश कर रहा हूं और परिणाम c
में संग्रहीत कर रहा हूं। मेरे पास चार अलग-अलग प्रयास हैं, जिनमें से तीन काम करते हैं; अंतिम अपेक्षित परिणाम नहीं उत्पन्न करता है।दो संख्याओं को जोड़ना
पहले दो उदाहरण मध्यवर्ती रजिस्टर का उपयोग करते हैं, और ये दोनों ठीक काम करते हैं। तीसरे और चौथे उदाहरण इंटरमीडिएट रजिस्टर के बिना सीधे दो मानों को जोड़ने का प्रयास करते हैं, लेकिन परिणाम ऑप्टिमाइज़ेशन स्तर और उस क्रम के आधार पर भिन्न होते हैं जिसमें मैं इनपुट मान जोड़ता हूं। मुझे क्या गलत हो रहा है?
पर्यावरण है:
int a = 4;
int b = 7;
int c;
उदाहरण 1::
asm(" movl %1,%%eax;"
" addl %2,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
उदाहरण 2:
i686-apple-darwin10-gcc-4.2.1 (GCC) 4.2.1 (Apple Inc. build 5666) (dot 3)
पहले, चर इस प्रकार की घोषणा की जाती
asm(" movl %2,%%eax;"
" addl %1,%%eax;"
" movl %%eax,%0;"
: "=r" (c)
: "r" (a), "r" (b)
: "%eax"
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output: a=4, b=7, c=11
उदाहरण 3:
asm(" movl %2,%0;"
" addl %1,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=11
// output with -O3: a=4, b=7, c=14
उदाहरण 4:
// this one appears to calculate a+a instead of a+b
asm(" movl %1,%0;"
" addl %2,%0;"
: "=r" (c)
: "r" (a), "r" (b)
);
printf("a=%d, b=%d, c=%d\n", a, b, c);
// output with -O0: a=4, b=7, c=8
// output with -O3: a=4, b=7, c=11
हल किया।Matthew Slattery's answer सही है। से पहले, यह b
और c
दोनों के लिए eax
पुन: उपयोग करने की कोशिश कर रहा था:
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %eax
addl %eax, %eax
जगह में मैथ्यू के सुझाव दिया गया समाधान के साथ, अब ecx
का उपयोग करता c
अलग से पकड़ करने के लिए।
movl -4(%rbp), %edx
movl -8(%rbp), %eax
movl %edx, %ecx
addl %eax, %ecx
ऑप्टिमाइज़ेशन सक्षम या बिना, मेरे लिए ठीक काम करता है। असेंबली भाषा सूची प्राप्त करने के लिए, एसएस के साथ संकलन करने का प्रयास करें। फिर आप देख सकते हैं कि कौन से रजिस्टरों का उपयोग किया जा रहा है। – TonyK
बस ध्यान दिया कि मुझे अनुकूलन स्तर के आधार पर अलग-अलग परिणाम मिलते हैं। नए नमूने के साथ अद्यतन कोड नमूने। –
तो असेंबली सूची आपको क्या बताती है? – TonyK