学习笔记

此书前言

无论任何事情,了解其本质非常重要。只有了解了本质才能提高利用效率。这样一来,即使有新技术出现,也能很容易的理解并掌握。

第1章 对程序员来说CPU是什么

本章提问

  1. 程序是什么?
  2. 程序是由什么组成的?
  3. 什么是机器语言?
  4. 正在运行的程序存储在什么位置?
  5. 什么是内存地址?
  6. 计算机的构成元件中,负责程序的解释和运行的是哪一个?

本章重点

重点要理解寄存器

1.1 CPU内部结构解析

一、先看程序运行的一般流程:
这个图可能只是在说编译型语言吧。
在程序运行过程中,CPU负责解释和运行最终转换成机器语言的程序内容
二、CPU的组成

  • CPU是由寄存器、控制器、运算器、时钟组成的;
  • 寄存器用来暂时存储指令、数据等对象,一个CPU可能会有20~100个寄存器;
  • 控制器负责把内存上的指令和数据读入寄存器,并根据运算结果来控制计算机;
  • 运算器负责运算被读入寄存器的内容;
  • 时钟负责发出CPU开始计时的信号。


三、内存
通常说的内存指计算机的主存储器,其中的数据会随关机而清除。


1.2 CPU是寄存器的集合体

程序员需要重点关注寄存器,其它的了解即可,因为程序是把寄存器作为对象来描述的
使用高级语言编译后会转化成机器语言,然后再通过CPU内部的寄存器来处理。
通过阅读汇编语言的代码,可以了解转化成机器语言的程序运行情况。
汇编语言为每一个机器语言指令添加一个助记符,汇编语言与机器语言是一一对应的。将汇编语言转化为机器语言称为汇编,反之称为反汇编。
下面是一个汇编语言示例:
其中,add(相加)与mov(存储,move)都是助记符,eax和ebp都是寄存器。
从示例中可以看出,机器语言级别的程序是通过寄存器来处理的。
我们可以将寄存器大致分为8类,用于运算的数值放在累加寄存器中存储,表示内存的数值放在基址寄存器和变址寄存器中存储,上面的eax和ebp分别是累加寄存器和基址寄存器。

对程序员来说,CPU就是具有各种功能的寄存器的集合体。


1.3 决定程序流程的程序计数器

下图中的流程计算123+456:
一个命令或一个数据通常被存储在多个地址上,为了便于说明,图中将其都分配到了一个地址中。

  1. 操作系统把程序复制到内存;
  2. 程序运行,没运行一步,程序计数器加一;
  3. 控制器根据程序计数器的数值,从内存读取命令并执行。

总而言之,程序计数器决定程序的流程。


1.4 条件分支和循环机制

程序的流程分为顺序条件分支循环三种。
下面的图很清楚的讲述了条件分支时的程序计数器依靠跳转指令(jump)运作:

关于标志寄存器:
标志寄存器负责保存运算结果的正、负、零,还有溢出、奇偶校验的结果。正、负、零三种状态保存寄存器的三个位,根据数据状态把相应位置为1。
关于比较运算:
实际上是把要比较的两个数相减后把结果的状态保存到标志寄存器中。


1.5 函数的调用机制

依靠call、return指令和栈实现调用函数的下一行指令的返回。

  1. 调用函数时,call会把调用函数后要执行的指令存储在名为栈的主存内;
  2. 函数执行完毕后,再用return把栈中的地址设定到程序计数器中实现返回。


1.6 通过地址和索引实现数组

实现数组要依靠基址寄存器和变址寄存器。基址寄存器不变,改变变址寄存器,变址寄存器的值就相当于数组的索引。


1.7 CPU的处理其实很简单

虽然程序很复杂,但是CPU执行的机器语言指令种类是比较少的,下图对指令进行了大体分类:


问题答案:

  1. 一般所说的程序,指的是行事的先后顺序,计算机程序与之类似,指的是指示计算机每一步动作的一组指令;
  2. 指令和数据。程序是指令和数据的组合体。如print("Hello"),print是指令,Hello是数据。
  3. CPU可以直接识别并使用的语言;
  4. 内存,硬盘等媒介保存的程序需要复制到内存后才能运行;
  5. 内存中,用来表示指令和数据存储位置的数值;
  6. CPU.

第2章 数据是用二进制数表示的

本章提问

  1. 32位是几个几个字节?
  2. 二进制数01011100转换成十进制数是多少?
  3. 二进制数00001111左移两位后,会变成原数的几倍?
  4. 补码形式表示的8位二进制数11111111,用十进制数表示的话是多少?
  5. 补码形式表示的8位二进制数10101010,用16位的二进制数表示的话是多少?
  6. 反转部分图形模式时,使用的是什么逻辑运算?

本章重点

二进制及其运算


2.1 用二进制数表示计算机信息的原因

计算机内部的电子元件是由IC(Integrated Circuit,集成电路)构成的,CPU也不例外。IC的的旁边有引脚,有电流通过时,表示1,反之表示0。

其中一个引脚表示一位(bit, 即binary digit),8位表示一个字节,内存和磁盘都是用字节单位储存和读写数据,因此,字节是信息的基本单位。32位处理器,即表示一次可以处理32位(4字节)的二进制信息。

对于用二进制表示的信息,计算机不会区分它是数值、文字,还是某种图片的模式等,而是根据编写程序的各位对计算机发出的指示来进行信息的处理。


2.2 什么是二进制数

各种进制的转换。


2.3 移位运算和乘除运算的关系


左移运算需要在空出来的低位补0,右移运算在后面说明。另外,移位导致溢出的数字,直接丢弃即可。
可以依靠移位运算来进行乘除运算,二进制左移后会变为原来的二倍、四倍等等,右移会变为二分之一、四分之一等等。


2.4 便于计算机处理的补数

将所有的位取反再加一就得到补数,数及其补数互为相反数。

为什么数与其补数互为相反数?

计算机用加法实现减法运算,减某数就等于加上某数的补数。


2.5 逻辑右移和算术右移的区别

什么是逻辑右移?

当二进制数的值表示图形模式而非数值时,移位后需要在最高位补0.类似于霓虹灯往右滚动的效果。

什么是算术右移?

当二进制数作为带符号的数值进行运算时,移位后要在最高位填充移位前符号位的值(0或1),这就叫算术右移。

只有在右移时才必须区分逻辑右移和算术右移的区别。左移时,只需要在空出来的低位补0即可。

符号填充:


2.6掌握逻辑运算的窍门

4种类型:逻辑非、逻辑或、逻辑与、逻辑异或。


答案:

  1. 4
  2. 92
  3. 4倍
  4. -1
  5. 1111111110101010
  6. 异或

第3章 计算机进行小数运算时出错的原因

本章提问

本章重点

计算机进行小数处理的机制

3.1 将0.1累加100次也得不到10



3.2 用二进制数表示小数

就是用负数来表示相应位数的指数


3.3 计算机运算出错的原因

如图:
二进制小数无法连贯的表示十进制小数


3.4 什么是浮点数

浮点数的形式:
浮点数由符号、尾数、基数、指数四部分构成。
浮点数的构造(IEEE的规定):
其中,符号部分非0即1;尾数部分用的是“将小数点的前面的值固定为1的正则表达式”,指数部分用“EXCESS系统表现”。简单的来说,小数就是尾数部分×2的指数部分次幂
PS,正则表达式是按照特定的规则来表示数据的形式


3.5 正则表达式和EXCESS系统

尾数部分是如何用正则表达式来表示的呢?

先看十进制。比如十进制数0.75,可以用很多种方法来表示它,正如下图所示。由于方法太多,需要制定一个统一的规则方便计算机处理,比如可以规定十进制小数“小数点前面是0,小数点后面第一位不能是0”。

同样的,我们也可以为二进制指定规则。在二进制中,我们使用的是“将小数点前面固定为1”的正则表达式(个人理解:由于二进制只由0、1组成,如此做就相当于在小数点前保留1位有效数字)。这样的话,第一位中的1可以不去保存,因为怎么样都是1,这样就节省了一个数据位,也就可以表示更大范围的数据。
如果第1位始终是1,那么0怎么表示呢?查了资料,当尾数和指数均为0时,表示0,那1又怎么表示呢...........暂时还没有找到资料,知道的大佬可以告诉我下。

指数部分与EXCESS系统

就是把中间的数当成0来看。


3.6 在实际的程序中进行确认



说下我的理解,memcpy就相当于把data内存中由0、1组成的序列复制到buff中去,但是程序中buff的值是用十进制显式表示的,所以需要不停对2取余获得真实的二进制序列。
程序结果及解释:


3.7 如何避免计算机计算出错

  1. 回避策略,即无视错误,一点微小的偏差不会造成什么严重后果;
  2. 扩大相应的倍数用整数进行运算;
  3. 采用BCD方法。(暂时不太懂)


    3.8 二进制数和十六进制数

    二进制的4位等于十六进制的1位。


    问题答案:


    《程序是怎样跑起来的》 (中)

转载于:https://www.cnblogs.com/xmusxy/p/10914343.html

《程序是怎样跑起来的》(上)相关推荐

  1. 《程序是怎样跑起来的》(上、中、下)

    计算机基础原理(包含程序是怎样跑起来的上中下) https://www.cnblogs.com/xmusxy/category/1469722.html <程序是怎样跑起来的>(上) 学习 ...

  2. python做好的程序如何变成小程序-使用python编写简单的小程序编译成exe跑在win10上...

    每天的工作其实很无聊,早知道应该去IT公司闯荡的.最近的工作内容是每逢一个整点,从早7点到晚11点,去查一次客流数据,整理到表格中,上交给素未蒙面的上线,由他呈交领导查阅. 人的精力毕竟是有限的,所以 ...

  3. 让Qt应用程序跑在Android上

    Qt最大的优势就是跨平台,一次性开发的Qt应用程序,可以跑Windows.跑linux.跑MAC--如今移动平台android操作系统如此火爆,Qt当然不能放过对android的支持,对了,还有iph ...

  4. linux .net程序,.Net程序跑在Linux上

    .Net越来越拥抱开源了,今天就试了如何让.Net程序跑在Linux上,果然再无人可以阻挡.Net的脚步了. Linux Disibutaion:Open Logic 7.2 1.Install .N ...

  5. 《程序是怎样跑起来的》读书笔记

    2017-2-25 前段时间读完<程序是怎样跑起来的>,对程序的运行过程认识更深.书中前六章讲解了CPU.二进制.内存与磁盘.数据压缩,比较易于理解,读过之后也收益良多.后面章节涉及汇编语 ...

  6. LabVIEW用了多线程,程序是不是会跑的更快些

    LabVIEW用了多线程,程序是不是会跑的更快些 这个取决于具体的应用程序.如果应用程序中的任务顺序执行,不会看到任何改善.比方说,程序打开文件,从文件中读取数据,然后关闭文件.多线程并不能使的应用程 ...

  7. 程序是怎么跑起来的——虚拟内存与动态链接

    0.前言 计算机的核心任务就是运行程序,而程序是如何运行的?这个问题一直困扰我很多年.网上有很多资料介绍程序如何被编译,如何被链接,然后装载,最后到OS中运行的,但都很分散,讲到的都是点,很少有串起来 ...

  8. 《程序是怎样跑起来的》矢泽久雄[日] - 读书笔记

    <程序是怎样跑起来的>矢泽久雄[日]  读书笔记,详细建议阅读原版图书学习 一 CPU是什么 1 程序由指令与数据组成,是指示计算机每一步动作的一组指令,机器语言指的是CPU可以直接识别并 ...

  9. 网易云引领程序员健康跑,Running Coder火爆IT界

    12月10日,由网易云举办的Running Coder程序员联跑活动成功举办,本次活动总共吸引了193名程序员到场,其中还有铁人三项记录保持者.108公里越野马拉松长跑选手现场助阵,气氛火爆,参与跑步 ...

最新文章

  1. python3中unicode怎么写_详解python3中ascii与Unicode使用
  2. 统一代码风格工具 editorConfig
  3. Linux服务器下使用命令行登录校园网(深大为例)
  4. python win10 桌面_Python3如何实现Win10桌面自动切换
  5. 01 辅助函数之加密函数
  6. Jmeter如何在大并发测试下,让登录或者后续接口只执行一次?
  7. String.format中大括号的加入方法
  8. 项目成本管理---控制成本
  9. 效率:标记语言:markdown
  10. 水电缴费系统php源码_php简易扫码付教育收费系统 v1.2
  11. Java简答题库_java题库3-简答题.doc
  12. PHP开发从入门到实战教程分享
  13. 云开发数据库update函数控制台显示更新成功,但数据库中的数据并没有更新(已解决)
  14. 各个键盘按键KeyValue值
  15. aps生产排程解决家具用品业的难题
  16. Gentoo 2005.1 完整的USE参数清单中文详解(转)
  17. CSS的3d翻滚特效
  18. 计算机类高水平文章,作为本科生的我,如何成功发表高水平会议论文
  19. hdf5 目录没有serial_hdf5
  20. CSS代码常用代码以及前端图片代码

热门文章

  1. Spring AOP原理及拦截器
  2. 组信箱共享及挂载介绍
  3. Silverlight MMORPG团队项目截图
  4. Windows下完成端口移植Linux下的epoll
  5. what do we want for advertiesement
  6. my current journal index is in q3
  7. what companies will vc invest?
  8. awesome xjtlu github project
  9. while listening lectures
  10. 我的思维模式的阿喀琉斯之踵