《程序是怎样跑起来的》读书笔记1——对程序员来说CPU是什么
一丶什么是程序
程序是指令和数组的组合体,如:print("你好世界"),其中print是指令,你好世界是数据。
CPU能直接识别和执行的只有机器语言,使用C,java这种高级语言编写的程序需要编译转换后才可以运行。
二丶CPU的内部结构
CPU即中央处理器,相当于计算机的大脑,内部由许多晶体管构成,负责解释和运行最终转换成的机器语言程序。

- 寄存器:暂存指令和数据等处理对象。
- 控制器:负责把内存上指令,数据等读入寄存器,并根据指令的执行结果来控制整个计算机。
- 运算器:负责运算从内存读入到寄存器的数据
- 时钟:负责发起cpu开始计时的时钟信号,时钟信号频率单位为赫兹,频率越高CPU运算速度越快。
程序启动后,根据时钟信号,控制器会从内存中读取指令和数据,通过对这些指令加以解释和运行,运算器会对数据进行运算,控制器根据计算结果来控制计算机(控制:除了数据运算之外的处理,比如内存和磁盘等输入输出设备,显示器,打印机等的输出)
三丶寄存器
1.为什么需要寄存器
CPU 的运算速度远高于内存的读写速度,为了避免被拖慢,CPU 都自带一级缓存和二级缓存,但是数据在缓存中地址并不固定,cpu每次读写缓存都需要寻址,为了减少寻址的开销,最频繁读写的数据(比如循环变量),都会放在寄存器里面,CPU 优先读写寄存器,再由寄存器跟内存交换数据
2.从一段汇编开始了解寄存器
mov eax, dword ptr [ebp-8] #将数值从内存赋值到eax寄存器
add eax, dword ptr [ebp-0ch] #eax的数值和内存的数值相加
mov eax, dword ptr [ebp-4],eax #把eax的数值(上一步计算的结果)存储到内存中
使用高级语言编写的程序在编译后转化为机器语言,机器语言基本上和汇编一一对应。
上面代码中 eax,ebp都是寄存器的名称,
| 种类 | 功能 |
|---|---|
| 累加寄存器 | 存储执行运算的数据和运算后的数据 |
| 标志寄存器 | 存储运算处理后cpu的状态 |
| 程序计数器 | 存储下一条指令所在的内存地址 |
| 基址寄存器 | 存储数据内存的起始地址 |
| 变址寄存器 | 存储基址寄存器的相对位置 |
| 通用寄存器 | 存储任意数据 |
| 指令寄存器 | 存储指令,cpu内部使用,程序员无法修改 |
| 栈寄存器 | 存储栈区域的起始地址 |
其中程序计数器,累加寄存器,标志寄存器,指令寄存器和栈寄存器只有一个,其他的寄存器一般存在多个。

对于程序员来说只需要理解寄存器的作用,cpu是一组寄存器的组合
3.程序计数器
程序启动后,操作系统会将硬盘中保存的程序复制到内存中,命令和数据通常被存储到多个地址上,操作系统在复制程序到内存的时候,会将程序计数器设定为起始位置,CPU每执行一个指令,程序计数器就会自动加上1,因此CPU会依据程序计数器的数值从内存读取命令并执行。
4.条件分支和循环机制是怎么 实现的

条件分支和循环中使用跳转指令,需要参照当前执行的运算结果来判断是否跳转,其中标志寄存器会保存当前计算的结果,条件分支在跳转指令钱会进行比较运算,至于是否执行跳转指令,则由cpu参考标志计算器的内容后进行判断。
5.函数的调用机制
调用函数的本质是将程序计数器设置为函数的存储地址。不过这和条件循环分支不同,因为丹村的跳转指令没办法实现函数的调用,函数调用结束后需要回到原本的调用点。
机器语言使用call,return指令解决这个问题,调用函数使用call指令,call指令会将要执行的指令地址存储到栈内存中。

函数处理完毕后,再通过函数的出口执行return指令,return指令会将栈中地址设定到程序计数中。

《程序是怎样跑起来的》读书笔记1——对程序员来说CPU是什么的更多相关文章
- 远程办公《Remote》读书笔记:中国程序员在家上班月入过六万不是梦
这不是一本新书,这是一本很值得中国程序员看的老书,所以我不是来做卖新书广告的:) 但它的确是一本好书,这本书在Amazon上3个business categories排第一.作者Jason Fried ...
- (第一章)对程序员来说CPU是什么
这几天,看到一本书,<程序是怎么跑起来的>,觉得之前都没有完整的看完一本书,现在要从这本书开始,慢慢的培养自己写读书笔记的习惯,不能度过去就忘了. 学习是一个螺旋上升的过程,不要指望一下子 ...
- 一:对程序员来说CPU是什么?
0.开篇 (1)程序是什么? 指示计算机每一步动作的一组指令 (2)程序是由什么组成的? 指令和数据 (3)什么是机器语言? ...
- 《程序是怎样跑起来的》读书笔记——第一章 对程序员来说CPU是什么
1 程序的运行流程 2 CPU的组成 3 寄存器的主要种类和功能 "程序计数器"--决定程序流程的 4 条件分支和循环机制 4.1 顺序执行 4.2 选择分支 5 函数的调用机制 ...
- 错误内存【读书笔记】C程序中常见的内存操作有关的典型编程错误
题记:写这篇博客要主是加深自己对错误内存的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 对C/C++程序员来讲,内存管理是个不小的挑战,绝对值得慎之又慎,否则让由上万行代码构成的 ...
- 《改善python程序的91个建议》读书笔记
推荐 <改善Pthon程序的91个建议>是从基本原则.惯用方法.语法.库.设计模式.内部机制.开发工具和性能优化8个方面深入探讨编写高质量python代码的技巧.禁忌和最佳实践. 读书就如 ...
- Node.js高级编程读书笔记 - 6 应用程序构建和调试 - Never
Explanation 现阶段console.log(...),util.inspect(...), JSON.stringify(...)在控制台输出已经够用了[2015/07/19]. 单元测试隶 ...
- 读书笔记一 Java程序员的基本修养(数组及其内存管理)
1.1 数组初始化 1.1.1 java数组是静态的 java数组被初始化之后,该数组所占的内存空间.数组长度都是不可变的. java程序中的数组必须经过初始化才可使用. 数组的初始化有两种方式: 1 ...
- 《Effective C#中文版:改善C#程序的50种方法》读书笔记
作者: suyan010203 来源: 博客园 发布时间: 2011-07-09 14:47 阅读: 8988 次 推荐: 4 原文链接 [收藏] 从去 ...
- 《java并发编程实战》读书笔记9--并发程序的测试
第12章 并发程序的测试 大致分为两类:安全性测试和活跃性测试 12.1 正确性测试 找出需要检查的不变性条件和后验条件.接下来将构建一组测试用例来测试一个有界缓存.程序清单12-1给出了Bounde ...
随机推荐
- Git、GitHub、GitLab三者之间的区别
1.Git Git是一个版本控制系统. 版本控制是一种用于记录一个或多个文件内容变化,方便我们查阅特定版本修订情况的系统. 总结: (1)分布式版本控制系统下的本地仓库包含代码库还有历史库,在本地就可 ...
- 【NumPy】Python利用linspace进行数据采样
情景 假设有一堆长度为1000的数据,我现在只想要其中800个并且要求整体趋势一样,那就可以试试使用linspace进行等间距的采样. 简介 linspace(start, stop, num=50, ...
- 【peewee】Python使用peewee时where中不同类型比较的问题
问题 以学生表为例,TableStudents表中age字段是TextField类型,想要筛选出18岁以上的学生 TableStudents.select().where(TableStudents. ...
- 【xUtils框架问题】xUtils继承基类的x.view().inject(this)绑定点击事件@Event无效
由于看得教程里的xUtils比较老了,不知道什么版本的. 还是使用ViewUtils.inject()进行绑定反射的,使用@OnClick进行点击监听绑定的. 3.9.0版本的xUtils使用: x. ...
- Java中double保留2位小数(精度丢失)的两种方式
Java中double保留2位小数(精度丢失)的两种方式 在我们日常开发中,使用double数据类型进行计算,偶尔会出现精度丢失的情况,例如实际结果是0.75,就可能出现0.7500000000000 ...
- 【python】第一模块 步骤四 第二课、实现飞机大战(未完待续)
第二课.实现飞机大战 一.项目介绍 项目实战:飞机大战 课程目标 掌握面向对象分析和开发的思想 能对项目进行拆分,进行模块化开发 了解项目开发的基本流程 理解并运用python的包.模块相关知识 理解 ...
- maya灯光导入houdini插件开发——技术文档
如果想了解插件开发流程的话,可以参考我另外一篇文章maya灯光导入houdini插件开发 插件下载地址 接下来我将说明怎么使用这插件(因为之前写过技术文档,所以也懒得再写一份了,直接照搬上来) 1.插 ...
- 导出数据库表以及备注为excel
import com.alibaba.excel.annotation.ExcelProperty; import lombok.AllArgsConstructor; import lombok.D ...
- c# 连接SQLite 查询数据 写入txt文本
using Newtonsoft.Json.Linq; using System; using System.Data.SQLite; using System.IO; namespace @publ ...
- SQL Server触发器备份后还原
测试环境SQL Server 2012 select a.definition , b.name,b.is_disabled from sys.sql_modules a inner join sys ...