开发者

Why is my stack pointer only incrementing in multiples of 16?

Using the following C code

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

Compiling using gcc -S -O -o- myfile.c I get the output

    .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

Here I would expect the third line after func: to be sub esp,12 instead of sub esp,16. I played with different numbers of automatic variables in the function and found that it grows in increments of 16 bytes. Why does this happen? Does this happen on all platforms, or is it platform specific?

I'm currently running an Intel Mac with OSX, compiling through an Ubuntu (32-bit) VirtualBox guest using GCC开发者_运维技巧.


From GCC man page, (bold emphasis mine):

-mpreferred-stack-boundary=num

Attempt to keep the stack boundary aligned to a 2 raised to num byte boundary. If -mpreferred-stack-boundary is not specified, the default is 4 (16 bytes or 128 bits).


That is very strange output.

Are you sure the c file wasn't:

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

?

Otherwise why the lines

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


x86_64 ABI requires the stack to be 16-byte aligned

Stack allocation, padding, and alignment

For 32-bit OS X then it does that because of SSE and some other reasons

Why does the Mac ABI require 16-byte stack alignment for x86-32?

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜