学习目标:
背景介绍:跨专业转码选手,已入职一年,目前通过一些科普书籍对计算机体系有一个初步的认知,后续将会对四大课程进行系统的学习
引用该书原作者的一句话开始终身学习之旅
了解本质非常重要,这句话对任何事物都是成立的。只有理解本质才能举一反三,才能够更容易地理解新技术
学习内容:
此处罗列该书的目录结构
- 对程序员来说CPU,到底是什么
- 用二进制来理解数据
- 计算机在计算小数时会出错的原因
- 让内存化方为园
- 内存与磁盘的密切联系
- 自己动手压缩数据
- 程序在怎样的环境下运行
- 从源文件到可执行文件
- 操作系统与应用程序的关系
- 通过汇编语言认识程序的真面目
- 访问硬件的方法
- 如何让计算机“学习”
第一章读书笔记 —— 对程序员来说,CPU到底是什么
cpu中的组成部分 | 作用 |
---|---|
控制器 | 根据时钟信号从内存中读取指令和数据 |
运算器 | 通过对指令进行解释和执行,对数据进行运算 |
时钟 | 产生时钟信号 |
寄存器 | 按照功能分类为以下几种 |
累加器 | 存放执行运算的数据和运算结果 |
标志寄存器 | 存放运算处理后cpu的状态 |
程序计数器 | 存放下一条指令所在的内存地址 |
基址寄存器 | 存放数据内存的起始地址 |
变址寄存器 | 存放基址寄存器的相对地址 |
通用寄存器 | 存放任意数据 |
指令寄存器 | 存放指令,仅cpu内部使用 |
栈寄存器 | 存放栈空间的起始地址 |
根据程序中常用的几种语法来描述上述寄存器的作用
顺序执行(程序计数器)
操作系统将程序从硬盘复制到内存之后,就会将程序计数器的值设置为0100,然后程序开始执行,cpu每执行一条指令,程序计数器的值就会自动加1,直至执行完所有指令
这里有一个小疑问,0105中的数据取出来之后0106的数据会自动填充到0105的位置上吗?不然为什么0101的指令中还是从0105的地址中取值的呢?
地址 | 内存中的内容 |
---|---|
0100 | 指令:将地址0105中的值存放到累加器中 |
0101 | 指令:将地址0105中的值存放在通用寄存器中 |
0102 | 指令:将累加器和通用寄存器中的值相加并存放到累加器中 |
0103 | 指令:将累加器中的值显示在屏幕上 |
0104 | 指令:程序结束(返回操作系统) |
0105 | 数据:123 |
0106 | 数据:456 |
条件执行(标志寄存器)
标志寄存器会根据上次运算的结果,保存累加器和通用寄存器的值,无论是正数、负数还是零,都会保存(也会保存溢出和奇偶校验的结果)。假设要将累加器中的值XX和通用寄存器中的YY进行比较,当执行指令时,CPU的运算其会在内部执行XX-YY的操作,差值的结果即代表比大小的结果
地址 | 内存中的内容 |
---|---|
0100 | 指令:将地址0106的值存放到寄存器中 |
0101 | 指令:将累加器中的值与0进行比较 |
0102 | 指令:如果累加器中的值大于0则跳转到地址0104 |
0103 | 指令:将累加器中的值的符号取反 |
0104 | 指令:将累加器中的值先是在屏幕上 |
0105 | 指令:程序结果(返回操作系统) |
0106 | 数据:123 |
函数调用(栈寄存器)
函数调用时使用调用指令和返回指令来实现
- 调用指令:在将函数入口地址设置到程序计数器之前,会将函数调用的下一条指令的地址保存到栈的空间中
- 返回指令:在函数体执行完毕之后,将保存在栈中的地址设置到程序计数器中
数组使用(基址和变址寄存器)
实际地址 | =基址寄存器 | + 变址寄存器 |
---|---|---|
10000000 | 10000000 | 00000000 |
10000001 | 10000000 | 00000001 |
10000002 | 10000000 | 00000002 |
… | … | … |
1000FFF | 10000000 | FFF |