实验目的是通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的,深入了解存储程序计算机工作原理
C程序源代码如下
int g(int x)
{
return x + 2;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(3) +1;
}
在自己的CentOS虚拟机经过反汇编,去除其他信息后的汇编代码如下
使用命令行
gcc main.c -S -o main.s -m32
删除其他内容之得到后的汇编指令如下
g:
pushl %ebp 当前函数调用基址压栈
movl %esp,%ebp esp指向esp
这两步目的是初始化本函数的调用堆栈
movl 8(%ebp),%eax ebp上8位指向的地址赋给eax寄存器
获取参数
addl $2,%eax eax寄存器+2
执行指令
popl %ebp ebp出栈
ret
功能是通过清理本函数的调用堆栈返回函数调用之前代码继续执行
f:
pushl %ebp 当前函数调用基址压栈
movl %esp,%ebp esp指向ebp
初始化
subl $4,%esp esp减4
movl 8(%ebp),%eax ebp+8指向的值赋给eax
movl %eax,(%esp) eax赋给esp指向的值
call g 调用g
leave
清理g的调用堆栈
ret 返回函数调用之前代码继续执行
main:
pushl %ebp 当前函数调用基址压栈
movl %esp,%ebp esp指向ebp
subl $4,%esp esp减4
movl $3,(%esp) esp指向的内存地址存储的数值+3
执行函数
call f 执行f函数
addl $1,%eax eax寄存器指向的地址+1
leave
清理调用堆栈
ret 函数返回
总结
存储程序计算机一步步从寄存器读取并执行指令,通过操作寄存器和内存实现指令结果的输出。
函数调用堆栈展示了计算机调用函数的过程。
王靖志原创作品转载请注明出处
Powered by
《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000