从一段代码的汇编看计算机的工作原理
朱宇轲 + 原创作品转载请注明出处 + 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000
/*-------------------------------------以下内容是课堂笔记,咿呀咿呀呦!------------------------------------------*/
本课主要对计算机的运行原理和汇编语言进行了简单的介绍。
冯若依曼体系结构即存储程序计算机,也就是将程序写在内存中,由CPU通过总线从内存中读取一条条程序,根据程序的内容执行具体的步骤。
如图所示
CPU在读取指令时,通过寄存器IP来指向下一条指令(如果是32位系统,则为EIP)
CPU的寄存器分为通用寄存器、段寄存器、状态寄存器
四种寻址方式:
movl %eax,%edx edx=eax 寄存器寻址
movl $0x123,%edx edx=0x123 立即寻址
movl 0x123,%edx edx=*(int32_t*)0x123 直接寻址
movl (%ebx),%edx edx=*(int32_t*)ebx 间接寻址
movl 4(%ebx),%edx edx=*(int32_t*)(ebx+4) 变址寻址
了解pushl、popl、call 0x12345、ret命令
注意:IP寄存器一般不能随便修改,只能通过call、ret等命令更改!
函数的返回值默认使用EAX寄存器存储返回给上一级函数
/*-------------------------以下内容是实验分析,咿呀咿呀呦!------------------------------------------*/
首先写下这么一段C程序:
1 //linux.c 2 int g(x) 3 { 4 return x+3; 5 } 6 int f(x) 7 { 8 return g(x); 9 } 10 int main() 11 { 12 return f(10)+1; 13 }
在Linux的环境中输入如下指令:
gcc –S –o linux.s linux.c -m32
然后打开linux.s,就可以看到我们汇编后的代码(直接上截图了)
将里面以“.”开头的行去掉(这是为链接用的),得到汇编后的代码:
1 g: 2 pushl %ebp 3 movl %esp, %ebp 4 movl 8(%ebp), %eax 5 addl $3, %eax 6 popl %ebp 7 ret 8 f: 9 pushl %ebp 10 movl %esp, %ebp 11 subl $4, %esp 12 movl 8(%ebp), %eax 13 movl %eax, (%esp) 14 call g 15 leave 16 ret 17 main: 18 pushl %ebp 19 movl %esp, %ebp 20 subl $4, %esp 21 movl $10, (%esp) 22 call f 23 addl $1, %eax 24 leave 25 ret
接下来我们来分析一下改程序具体的流程。
程序一开始,CPU的IP寄存器指向汇编代码的第18行,假设堆栈在内存中的地址分别为0,1,2,3……堆栈基指针寄存器(EBP)和堆栈顶指针寄存器(ESP)均指向堆栈段0处。
第18~21行首先为main函数开辟新的内存区域,之后将传的参数10入栈,此时堆栈段如下所示:
然后程序调用call 函数,将IP入栈,IP指向代码第9行f处。
在f函数的代码处,首先为f函数开辟新的内存区域,接着将传入的参数10赋值给EAX,并将EAX入栈,此时堆栈段内存如下图:
程序在此调用call进入g函数。在g函数中,同样先是开辟内存空间,然后将参数传给EAX,并将EAX的值加上3。
之后将EBP出栈,并调用ret命令。此时IP重新指向f函数call之后的命令,堆栈内存的情况如下:
之后就是不断的调用leave与ret命令,跳出当前的内存区域,回到上一级函数的内存区域中,并将EAX的值加3,直到跳出main函数,至此程序结束。
从上面的分析中,我觉得可以归纳出以下几点:
1.计算机的运行流程确是遵循冯诺依曼框架,CPU将内存中的代码和数据读取到自己的寄存器中,再根据一条条命令调用寄存器进行进一步的操作。
2.在进入每一个程序之前,CPU都会将上一级的EIP和EBP压栈,相当于为新的函数重新开辟了一段新的内存空间,直到退出函数的时候才将它们出栈。与此同时,将函数的返回值保存在EAX中。
3.CPU的各个寄存器都有不同的分工,如EIP指向要执行的代码,EAX存储返回值等。它们贯穿于整个程序执行流程,自己写程序时一般不要轻易改动。
从一段代码的汇编看计算机的工作原理相关推荐
- 计算机CPU工作原理及汇编语言简介
计算机CPU工作原理及汇编语言简介(链接) 从微信公众号把原文直接复制过来,发现图片.表格经常丢失,只有纯文字,所以建议直接点击上述链接阅读. 复制过来的纯文字内容如下(图片.表格丢失, ...
- 计算机基础原理知识,计算机基础知识之计算机的工作原理
1.3 计算机的工作原理 到目前为止,微机的工作原理均采用冯.若依曼的存储程序方式,即把程序存储在微机内,由微机自动存取指令并执行它.微机的工作过程就是执行程序的过程,而程序由指令序列组成,因此,执行 ...
- 简要分析计算机的工作过程,计算机的工作原理.doc
第 周 星期 第 节 年 月 日 课 题 计算机的工作原理 教 学 目 标 1.知道计算机系统的组成 2.知道计算机系统的工作原理 教材分析 重点 计算机系统的工作原理 难点 计算机系统的工作原理 教 ...
- 计算机生活工作原理,计算机基本工作原理是什么?
在介绍计算机的工作原理之前,首先了解一下什么是计算机指令. 简单的理解,指令指的是能被计算机识别并执行的二进制代码,它规定了计算机能够完成的某一种操作.一条指令通常由 2 部分组成,分别是操作码和操作 ...
- 互联网应用基础第一课:计算机的工作原理、了解计算机的硬件与系统
知识点:计算机的工作原理.计算机硬件入门.计算机操作系统 1.了解计算机的基本组成 1.1 计算机概念理解 计算机(computer)俗称电脑,是现代一种用于高速计算的电子计算机器,可以进行数值计算, ...
- 现在使用计算机器工作原理,计算机显示器工作原理(17页)-原创力文档
计算机显示器工作原理 计算机显示器工作原理 显示器技术 长宽比和可视区域 多频扫描显示器 显示器连接 显示器的颜色深度 LCD显示器 LCD的功能和特性 CRT显示器 CRT的功能和特性 LCD和CR ...
- 计算机主板的工作原理,求计算机主板工作原理??
引言 计算机主板工作原理 如果您打开过计算机的机箱,您会看到有一个部件将所有部件连接在一起,那就是主板. 通过主板,计算机的所有部件可以得到电源并相互通信. 在过去二十年中主板已经取得了长足进展.第一 ...
- 电子计算机四个主要部件,计算机基本工作原理与主要部件(ppt 29页).ppt
07 03 2020 第1页 07 03 2020 第2页 计算机基础知识 07 03 2020 第3页 教学内容 计算机基本工作原理微型计算机操作知识计算机的主要部件 教学目的 了解微型计算机的基本 ...
- 现在使用计算机的工作原理是,计算机的工作原理是什么
很多人都会用电脑,那么你知道吗小编总结了一些资料,供大家参考! 计算机的基本原理是存贮程序和程序控制 预先要把指挥计算机如何进行操作的指令序列***称为程序***和原始数据通过输入设备输送到计算机内存 ...
最新文章
- 动手打造自己强大的右键菜单
- 机器学习资料整理,收藏了不后悔!
- MySQL命令之mysqldump -- 数据库备份程序
- pyqt5 最小化 系统托盘_Qt中如何使窗口隐藏/最小化到托盘
- android 类ios actionsheet效果
- python爬虫基础扫盲之HTTP以及HTTPS
- EmWin 接触---基础函数
- mybatis使用拦截器显示sql,使用druid配置连接信息
- 深度解读 | ElasticDL 深度学习框架简化编程,提升集群利用率和研发效率的秘诀...
- OpenCV中的reshape
- windows 环境变量设置
- 数据库同步功能要慎用
- 简单的光线追踪教程(一)
- 机械设备行业经销商管理系统细致化经销商管理,让渠道管理更可控
- win10关闭自动屏保
- 华为手机系统更新成鸿蒙,如何将自己的华为手机升级成鸿蒙系统
- 【小月电子】国产安路FPGA开发板系统学习教程-LESSON9简易测试系统
- download 下载文件 IE兼容性处理
- 显示控件——字符显示之艺术字
- oracle rman crosscheck,rman 之crosscheck 与delete expired