why gcc 4.x default reserve 8 bytes for stack on linux when calling a method?

前端 未结 3 1734
傲寒
傲寒 2021-01-02 15:06

as a beginner of asm, I am checking gcc -S generated asm code to learn.

why gcc 4.x default reserve 8 bytes for stack when calling a method?

func18 is the e

相关标签:
3条回答
  • 2021-01-02 15:45

    Some instructions require certain data types to be aligned to as much as a 16-byte boundary (in particular, the SSE data type __m128). To meet this requirement, gcc ensures that the stack is initially 16-byte aligned, and allocates stack space in multiples of 16 bytes. If only a 4-byte return address and 4-byte frame pointer need to be pushed, 8 additional bytes are needed to keep the stack aligned to a 16-byte boundary. However, if gcc determines that the additional alignment is unnecessary (i.e. the fancy data types are not used and no external functions are called), then it may omit any additional instructions used to align the stack. The analysis necessary to determine this may require certain optimization passes to be performed.

    See also the gcc documentation for the option -mpreferred-stack-boundary=num.

    0 讨论(0)
  • 2021-01-02 15:46

    Easy way to find out: Have you empty function call another function with one parameter. If the parameter is stored directly to the stack (no push), then that's what the extra space is for.

    0 讨论(0)
  • 2021-01-02 15:56

    As richard mentioned above, it's all because of optimization, showing below. but still I got no idea why 8 bytes reserved is something optimized?!

    original c

    void func18() {}
    int main() {return 0;}
    

    compile without optimization flag specified

        .text                                                                                   
    .globl _func18
    _func18:
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        leave
        ret
    .globl _main
    _main:                                                                                      
        pushl   %ebp
        movl    %esp, %ebp
        subl    $8, %esp
        movl    $0, %eax
        leave
        ret
        .subsections_via_symbols
    

    with -Os optimization flag, no more stack reserve

        .text
    .globl _func18
    _func18:
        pushl   %ebp
        movl    %esp, %ebp
        leave
        ret
    .globl _main
    _main:
        pushl   %ebp
        xorl    %eax, %eax
        movl    %esp, %ebp
        leave
        ret
        .subsections_via_symbols
    
    0 讨论(0)
提交回复
热议问题