2011-03-31 7 views
5

निम्नलिखित सी कोडमेरा स्टैक पॉइंटर केवल 16 के गुणकों में क्यों बढ़ रहा है?

void func() { 
    int a=1,b=2,c=3; 
} 

gcc -S -O -o- myfile.c का उपयोग कर संकलन का उपयोग करते हुए मैं उत्पादन

.file "myfile.c" 
    .intel_syntax noprefix 
    .text 
.globl func 
    .type func, @function 
func: 
    push ebp 
    mov ebp, esp 
    sub esp, 16 
    mov DWORD PTR [ebp-4], 1 
    mov DWORD PTR [ebp-8], 2 
    mov DWORD PTR [ebp-12], 3 
    mov DWORD PTR [ebp-16], 4 
    mov DWORD PTR [ebp-20], 5 
    leave 
    ret 
    .size func, .-func 
    .ident "GCC: (Ubuntu/Linaro 4.4.4-14ubuntu5) 4.4.5" 
    .section .note.GNU-stack,"",@progbits 

यहाँ मैं func: के बाद तीसरी लाइन sub esp,12 बजाय sub esp,16 होने की अपेक्षा करेंगे मिलती है। मैंने फ़ंक्शन में स्वचालित चर के विभिन्न नंबरों के साथ खेला और पाया कि यह 16 बाइट्स की वृद्धि में बढ़ता है। ऐसा क्यों होता है? क्या यह सभी प्लेटफार्मों पर होता है, या यह मंच विशिष्ट है?

मैं वर्तमान के साथ OSX एक इंटेल मैक चल रहा हूँ, एक Ubuntu (32-बिट) VirtualBox के अतिथि जीसीसी का उपयोग कर के माध्यम से संकलन।

उत्तर

8

GCC man page से, (बोल्ड जोर मेरा):

-mpreferred-ढेर सीमा = संख्या

ढेर सीमा एक 2 संख्या बाइट सीमा तक बढ़ा करने के लिए गठबंधन रखने के लिए प्रयास। यदि -mpreferred-stack-boundary निर्दिष्ट नहीं है, डिफ़ॉल्ट 4 (16 बाइट्स या 128 बिट) है।

+1

और संकलक यह क्यों करते हैं कि स्मृति निर्देशों तक पहुंचने के कुछ निर्देश * नहीं * गठबंधन प्रदर्शन प्रदर्शन प्राप्त करते हैं। – vidstige

+0

धन्यवाद, इस सवाल का जवाब और vidstige की टिप्पणी के बीच मैं जानकारी मैं :) –

+2

@vidstige @Martin की जरूरत है: या वे दुर्घटना, यहां तक ​​कि 86 पर (movaps देखते हैं, जैसे)। – Bahbar

2

बहुत ही अजीब उत्पादन है।

क्या आपको यकीन है ग फ़ाइल नहीं थी:

void func() { 
    int a=1,b=2,c=3,d=4,e=5; 
} 

?

अन्यथा क्यों लाइनों

mov DWORD PTR [ebp-16], 4 
mov DWORD PTR [ebp-20], 5 
+0

मैं आपसे सहमत हूं, लेकिन यह एक जवाब नहीं होना चाहिए। यह वास्तव में ओपी के सवाल का सवाल है। – andreee

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