所以...我编译成汇编程序,用gcc -S -02 -m32:subl在这里做什么?
void h(int y){int x; x=y+1; f(y); f(2); }
,它给我下面的:
.file "sample.c"
.text
.p2align 4,,15
.globl h
.type h, @function
h:
pushl %ebp
movl %esp, %ebp
subl $24, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call f
movl $2, 8(%ebp)
leave
jmp f
.size h, .-h
.ident "GCC: (GNU) 4.4.3 20100127 (Red Hat 4.4.3-4)"
.section .note.GNU-stack,"",@progbits
现在我知道什么pushl和MOVEL :它们将当前帧指针存储到堆栈中,然后将帧指针寄存器的值设置为堆栈指针的值。
- 但我不知道是什么subl $ 24,%esp是。我知道它将堆栈指针向下移动了24个字节。正确?
- 这是怎么回事?
- 为什么movl 8(%ebp),%eax使用8?它是8字节吗?这是为了适应返回值+参数和到h?或者我完全离开这里。所以这意味着从堆栈指针回看8个字节?
- 什么是movl $ 2,8(%ebp)做什么?它将Contant 2复制到帧指针之前的8个字节位置。当我们调用f时帧指针是否改变?如果是 - 那么8(%ebp)指向f的参数位置。
- 什么是假吗?它如何“移除”堆栈框架?我的意思是你不能删除一块内存。在文档中,它说mov(esp,ebp),pop ebp。
谢谢!
有趣的是,下面的答案被标记为接受,尽管它实际上没有给出问题1的解释。[Here]( http://stackoverflow.com/questions/1061818/stack-allocation-padding-and-alignment)是另一个问题/答案,给出了解释1。 – andreee 2015-12-15 20:24:00