[原创]通过简单的汇编代码了解计算机的工作原理
2016-03-04 00:00
218 查看
发在别处的文章,搬过来了。
首先编写一个简单的c程序:
在Linux下用gcc编译为汇编代码:
生成的汇编代码中有很多"."开头的行,都是链接信息,我们把这些行删除,以免影响阅读。最后剩下的汇编代码为:
我们来详细分析一下这段代码。首先解释一下几个寄存器的含义:
EBP - 存放栈的基地址
ESP - 存放栈的顶地址
EIP - 存放下一条指令的地址(这里我们为了描述简单用代码的行号表示)
EAX - 存放数值(后面会看到,它通常存放函数的返回值)
好,下面开始解释每条代码的含义
通过分析这个小程序的汇编代码,我们了解了程序执行的基本逻辑:
也就是通过堆栈的操作来执行函数的跳转,以及返回。
同时在每个函数执行期间,函数内部的变量都在栈上进行操作。
而返回值一般通过EAX来返回。
首先编写一个简单的c程序:
int g(int x) { return x + 6; } int f(int x) { return g(x); } int main() { return f(81) + 1; }
在Linux下用gcc编译为汇编代码:
gcc -S -o main.s main.c -m32
生成的汇编代码中有很多"."开头的行,都是链接信息,我们把这些行删除,以免影响阅读。最后剩下的汇编代码为:
g: pushl %ebp movl %esp, %ebp movl 8(%ebp), %eax addl $6, %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 $81, (%esp) call f addl $1, %eax leave ret
我们来详细分析一下这段代码。首先解释一下几个寄存器的含义:
EBP - 存放栈的基地址
ESP - 存放栈的顶地址
EIP - 存放下一条指令的地址(这里我们为了描述简单用代码的行号表示)
EAX - 存放数值(后面会看到,它通常存放函数的返回值)
好,下面开始解释每条代码的含义
通过分析这个小程序的汇编代码,我们了解了程序执行的基本逻辑:
也就是通过堆栈的操作来执行函数的跳转,以及返回。
同时在每个函数执行期间,函数内部的变量都在栈上进行操作。
而返回值一般通过EAX来返回。
相关文章推荐
- 安全摘记1:关于安全与黑客
- 数据结构学习之队列
- 厦门巨游网络科技有限公司(HOTPOWER)承接游戏UI外包
- #TCP你学得会# 之 accpet的谜题
- #TCP你学得会# 之 TCP_SYN_RECV的真相
- HTTP Live Streaming直播(iOS直播)技术分析与实现
- linux生产服务器有关网络状态的优化措施
- matlab神经网络工具箱的使用
- TCP的可靠性
- 【HTTP】Fiddler(一) - Fiddler简介
- 6-5-树的双亲表示法-树和二叉树-第6章-《数据结构》课本源码-严蔚敏吴伟民版
- RBF神经网络与BP神经网络的比较
- SPL的常用数据结构(2)
- Volley的简单使用
- TCP的三次握手和四次分手
- TCP连接(三路握手)
- 最简单的基于Flash的流媒体示例:网页播放器(HTTP,RTMP,HLS)
- 计算机网络----- TCP协议
- 计算机原理之linux初步扫盲篇
- 用ConnectivityManager判断网络类型