assembly - 为什么我的堆栈指针仅以16的倍数递增?

标签 assembly x86

使用以下C代码

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的Intel Mac,并使用GCC通过Ubuntu(32位)VirtualBox guest虚拟机进行编译。

最佳答案

GCC man page(强调我的名字):

-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).

关于assembly - 为什么我的堆栈指针仅以16的倍数递增?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5496045/

相关文章:

function - ARM 汇编语言中的两个函数/子例程

c - 如何将优化的 x86-64 asm 循环转换回 C for 循环?

linux - 汇编代码不识别?和@data

assembly - 我可以在现代系统上的汇编中使用 movl 代替 movb 或 movw 吗?

c - 进程页表

memory - gdb 'x' 命令有什么作用?

assembly - 插入全栈 8086 组件

c - 获取 x86 当前指令的地址

assembly - 组装中的随机数

assembly - x86 ASM : useless conditional jump?