图解分析汇编代码以理解计算机是如何工作的
来源:互联网 发布:眉间雪道姑捏脸数据 编辑:程序博客网 时间:2024/05/17 08:18
孙业毅 原创作品 转载请注明出处
《Linux内核分析》MOOC课程:在线课程链接http://mooc.study.163.com/course/USTC-1000029000
第一讲 计算机是如何工作的? 课堂笔记
@2015.03
---------------------------------------------------------------------------------------------------------------------------------------------------------------
冯诺依曼体系结构的计算机,又叫存储程序计算机,从硬件的角度来看,其工作模型是CPU依次读取内存中的指令来完成工作。但它具体是如何完成程序员编写的非线性执行的程序呢?本次课的实验,以一段汇编代码为例,详细介绍了CPU计算模块、寄存器和内存是如何配合工作的!
1 知识准备
1.1 汇编语言的五种寻址模式
· 寄存器寻址 registermode: %寄存器 例如:%edx 访问寄存器edx
· 立即寻址 immediate: $数字例如:$0x123 数值0x123
· 直接寻址 direct:数字 例如:0x123访问地址0x123指向的内存
· 间接寻址 indirect: (%寄存器) (%ebx) 例如:访问寄存器ebx中的地址指向的内存
· 变址寻址 displaced:偏移量(%寄存器) 4(%ebx):访问寄存器ebx中的地址再加4指向的内存;
1.2 几个重要的汇编指令
Example instruction
What it does
Pushl %eax
Subl $4, %esp //栈顶指针减4,栈在向下生长一个位置
Movl %eax, (%esp) //将eax中的值放入栈顶指针指向的内存位置
Popl %eax
Movl (%esp), %eax //从栈顶指针指向的内存中的值放入eax中
Addl $4, %esp //栈顶指针加4,栈在向上收缩
Call 0x12345
Pushl %eip //ip压栈
Movl $0x12345, %eip //将0x12345放入eip中
Ret
Popl %eip //ip出栈
2. 实验
2.1 实验环境
Ubuntu 12.4 LTS 操作系统,vi 编辑器,gcc 编译器
2.2 实验步骤
vi main.c 输入以下代码
int
g(
int
x)
{
return
x + 3;
}
int
f(
int
x)
{
return
g(x);
}
int
main(
void
)
{
return
f(8) + 1;
}
保存退出。
在命令行使用下面的命令,将这段c代码编译成汇编代码
gcc –S –o main.s main.c -m32
vi main.s 打开汇编代码文件,删除其中以符号点 开头的语句,得到如下可被计算机执行的汇编代码:
接下来,就以图解的方式来分析这段分析代码。
3. 汇编代码分析
对照c代码,很容易就知道,这段汇编代码也有三个函数,代码的执行从main函数的第一条语句开始。汇编代码共有22行可执行的代码,下面就用22张图来展示每一条语句执行后,主要寄存器的指向和堆栈的状态。其中,第0张图,是程序还未执行时的状态;第1张图,是程序执行完第一条语句后的情形;第2张图,是程序执行完第22条语句后的情形;依次类图,直到第21张图。最后一条语句是执行main函数中的 ret 语句,即将跳出了main函数,没有给出示意图。
在开始看图之前,这里先给出图示中的一些说明:
- 内存中堆栈是向下生长的,即堆栈丁的地址<=堆栈底的地址;这里为了方便描述,在程序开始执行时的,我们假定堆栈底和堆栈顶对应的地址编号是0,堆栈向下每增加一个位置,编号加1;
- EAX 寄存器用于存储函数的返回值,图示中会标出其值;其他三个寄存器EIP、EBP、ESP分别用箭头来表示其当前值;EIP就是指令寄存器,太总是指向当前正在执行的汇编指令的下一条汇编指令;EBP、ESP分别指向当前堆栈的底部和顶部;
- 图片中左边为汇编源代码,其中加粗的一行,表示当前正在执行的语句;图0中没有加粗的代码行,那是当然的,图0是程序准备执行第一条语句时的初始状态;
- 图片有点长,谢谢您的耐心 :)
再啰嗦下:旁白已经够多了,如果还不是很明白,强烈推荐您去看在线视频http://mooc.study.163.com/course/USTC-1000029000,那里是动态的,而且孟老师讲得非常详细。
好了,上图:
- 图解分析汇编代码以理解计算机是如何工作的
- 《Linux内核分析》之图解汇编代码以分析计算机是如何工作的
- 通过分析汇编代码来理解计算机是如何工作
- 第一次作业 图解汇编代码以及分析计算机是如何工作的
- 反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过汇编代码来理解计算机是如何工作的
- 分析一个简单C程序的汇编代码,理解计算机是如何工作的
- 计算机是如何工作的——汇编代码分析
- 计算机是如何工作的?--通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的(原创)
- lab1:通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 通过反汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- 实验一 通过汇编一个简单的C程序,分析汇编代码理解计算机是如何工作的
- ffmpeg进行音频解码,QAudioOutput播放解码后的音频
- 单元测试代码比产品代码还要多?
- Java中普通代码块,构造代码块,静态代码块区别及代码示例
- hdu2583
- Oracl.二.常用的SQL*Plus命令和环境变量
- 图解分析汇编代码以理解计算机是如何工作的
- HOG特征的理解
- ubuntu javah Can not find file for "xxxxx"
- HDU 2952 Counting Sheep
- Documents下存储文件被拒解决方法(文件存储策略应对)
- 软件设计 实践
- 学习网站+书籍分享
- adjacent_find
- [BZOJ 1072] SCOI 2007 排列perm · 动态规划