相关参考可见上一篇文章:http://blog.csdn.net/yd4751/article/details/46119787
做了一个小例子
例子程序:
使用了内嵌汇编
int main()
{
int a = 0;
__asm__ __volatile__("mov %%ebp, %0 \r\n"
:"=m"(a)
::"memory");
return 0;
}
汇编代码:使用gcc -S 获得
.file "test.c"
.text
.globl main
.type main, @function
main:
leal 4(%esp), %ecx
andl $-16, %esp
pushl -4(%ecx)
pushl %ebp
movl %esp, %ebp
pushl %ecx
subl $16, %esp
<span style="color:#ff0000;"> movl $0, -8(%ebp)</span>
#APP
<span style="color:#ff0000;">mov %ebp, -8(%ebp)</span>
#NO_APP
movl $0, %eax
addl $16, %esp
popl %ecx
popl %ebp
leal -4(%ecx), %esp
ret
.size main, .-main
.ident "GCC: (GNU) 4.1.1 20070105 (Red Hat 4.1.1-52)"
.section .note.GNU-stack,"",@progbits
可以发现,例子中的两句分别对应文中红色部分
这之前后之后的操作分别是压栈和出栈的操作
最后main函数栈的存储如下,如有错误请大家多多指教~