通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的,作者徐冰,原创作品,来自云课堂《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
1.C语言代码
#include<stdio.h>
int g(int x)
{
return x+3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8)+1;
}
2.在Linux64位上面生成汇编语言为:
需要声明:其中带.的为注释内容(已经删掉),寄存器ebp为堆栈底,esp为堆栈的顶部,
ret指令: pop eip
leave指令: movl %ebp,%esp popl %ebp
call指令:pushl %eip
g:
pushl %ebp
movl %esp, %ebp
movl 8(%ebp), %eax
addl $3, %eax
popl %ebp
ret
f:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl 8(%ebp), %eax
movl %eax, (%esp)
call g
leave
ret
main:
pushl %ebp
movl %esp, %ebp
subl $4, %esp
movl $8, (%esp)
call f
addl $1, %eax
leave
ret
3.分析堆栈的变化
程序从main函数开始: