通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
2016-02-27 14:35
906 查看
秦鼎涛 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
实验一
int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
二、实验楼截图:
![](http://images2015.cnblogs.com/blog/745115/201602/745115-20160227122927755-1237612451.png)
![](http://images2015.cnblogs.com/blog/745115/201602/745115-20160227122815130-119351120.png)
三、分析汇编代码的工作过程中堆栈的变化:
跟C语言一样,汇编代码也是从main函数开始执行的,计算机利用eip从main开始获取指令并执行,每次自加一,顺序执行,具体如下注释:
g:
pushl %ebp //ebp压栈
movl %esp,%eax
addl $3,%eax //eax=8+3=11
popl %ebp //ebp弹栈
ret //popl eip,跳转f函数eip(15)即leave处
f:
pushl %ebp //ebp压栈
movl %esp,%ebp //ebp跟esp指向同一位置
subl $4,%esp //esp-4
movl 8(%ebp),%eax //变址寻址8,对应值赋值给eax
movl %eax,(%esp) //把eax赋值给esp对应位置
call g //push eip;movl g,eip
leave //movl %ebp,%esp;popl %edp
ret //popl eip,执行main函数里addl $1,%eax
main:
pushl %ebp //把ebp压栈,ESP的值加一个字节
movl %esp,%ebp //ebp指向esp同一位置
subl $4,%esp //esp减4
movl $8,(%esp) //esp所指向位置存储立即数8
call f //push eip;movl f eip 即跳转函数f的指令
addl $1,%eax //eax=11+1=12
leave //movl %ebp,%esp;popl %edp,又一次变成空栈
ret //popl eip
P.S. 1.函数返回值默认使用eax寄存器存储返回给上一级函数。
四、总结
这次实验利用一个简单的c语言小程序,转换成汇编语言,通过对汇编代码的分析了解了计算机如何工作。汇编语言是介于高级编程语言
和机器语言之间的一种语言,更易于分析计算机工作过程。
计算机利用一系列的寄存器,获取内存中的指令,通过依次执行,来完成指令流所对应的函数或者说功能。
实验一
通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
一、C语言源代码:int g(int x)
{
return x + 3;
}
int f(int x)
{
return g(x);
}
int main(void)
{
return f(8) + 1;
}
二、实验楼截图:
![](http://images2015.cnblogs.com/blog/745115/201602/745115-20160227122927755-1237612451.png)
![](http://images2015.cnblogs.com/blog/745115/201602/745115-20160227122815130-119351120.png)
三、分析汇编代码的工作过程中堆栈的变化:
跟C语言一样,汇编代码也是从main函数开始执行的,计算机利用eip从main开始获取指令并执行,每次自加一,顺序执行,具体如下注释:
g:
pushl %ebp //ebp压栈
movl %esp,%eax
addl $3,%eax //eax=8+3=11
popl %ebp //ebp弹栈
ret //popl eip,跳转f函数eip(15)即leave处
f:
pushl %ebp //ebp压栈
movl %esp,%ebp //ebp跟esp指向同一位置
subl $4,%esp //esp-4
movl 8(%ebp),%eax //变址寻址8,对应值赋值给eax
movl %eax,(%esp) //把eax赋值给esp对应位置
call g //push eip;movl g,eip
leave //movl %ebp,%esp;popl %edp
ret //popl eip,执行main函数里addl $1,%eax
main:
pushl %ebp //把ebp压栈,ESP的值加一个字节
movl %esp,%ebp //ebp指向esp同一位置
subl $4,%esp //esp减4
movl $8,(%esp) //esp所指向位置存储立即数8
call f //push eip;movl f eip 即跳转函数f的指令
addl $1,%eax //eax=11+1=12
leave //movl %ebp,%esp;popl %edp,又一次变成空栈
ret //popl eip
P.S. 1.函数返回值默认使用eax寄存器存储返回给上一级函数。
四、总结
这次实验利用一个简单的c语言小程序,转换成汇编语言,通过对汇编代码的分析了解了计算机如何工作。汇编语言是介于高级编程语言
和机器语言之间的一种语言,更易于分析计算机工作过程。
计算机利用一系列的寄存器,获取内存中的指令,通过依次执行,来完成指令流所对应的函数或者说功能。
相关文章推荐
- 数据结构算法之排序系列Java、C源码实现(8)--基数排序
- 计算机视觉、机器学习相关领域论文和源代码大集合
- 数据结构算法之排序系列Java、C源码实现(7)--归并排序
- 片上网络
- 片上网络
- 【转】iOS,Android网络抓包教程之tcpdump
- 太原网络营销师讲百度竞价(SEM)如何快速掌握上手公司的竞价账户?
- centos的nginx+https配置
- 数据结构算法之排序系列Java、C源码实现(6)--快速排序
- 数据结构算法之排序系列Java、C源码实现(5)--冒泡排序
- 数据结构之单链表——带头节点和不带头节点(C/C++)
- 神经网络分类
- 数据结构算法之排序系列Java、C源码实现(4)--堆排序
- Wireshark基本介绍和学习TCP三次握手
- 数据结构算法之排序系列Java、C源码实现(3)--直接选择排序
- 20135323符运锦----第一周:计算机是如何工作的
- httpclient以post方式发送body
- 如何查看自己电脑的IP和网络运营商
- [神经网络]2.1-How the backpropagation algorithm works-Warm up: a fast matrix-based approach ...(翻译)
- 从汇编指令细看计算机程序的运行过程