程序是怎么跑起来的
萌新求别喷

今天开始自学程序 第一本书
qq1

程序咋跑的

  • cpu是啥
    • 1.0 cpu是什么+
    • 1.1 cpu的内部结构
    • 1.2 cpu是寄存器的集合体
    • 1.3 决定程序流程的程序计数器
    • 1.4 条件分支和循环机制
    • 1.5 函数的调用机制
    • 1.6 通过地址和索引实现数组
    • 1.7 cpu的处理其实很简单
    • 2.0 数据是用二进制表示的
    • 2.1 用二进制表示计算机信息的原因
    • 2.2 什么是二进制
    • 2.3 移位运算和乘除运算的关系
    • 2.4 便于计算机处理的补数
    • 2.5 逻辑右移和算术右移的区别
    • 2.6 掌握逻辑运算的窍门
    • 3.0 计算机进行小数运算计算错误的原因
    • 3.1 0.1累加100次也得不到10
    • 3.2 用二进制表示小数
    • 3.3 计算机运行出错的原因
    • 3.4 什么是浮点数
    • 3.5 正则表达式和excess系统
    • 3.6 在实际的程序中进行确认
    • 3.7 如何避免计算机计算出错
    • 3.8 十六进制
  • 4.0 熟练使用有棱有角的内存
    • 4.1 内存的物理机制很简单
    • 4.2 内存的逻辑模型是楼房
    • 4.3 简单的指针
    • 4.4 数组是高效使用内存的基础
    • 4.5 栈 队列 以及环形缓冲区
    • 4.6 链表使元素的追加和删除更容易
    • 4.7 二叉查找树使数据搜索更有效
    • 5.0 内存和磁盘的亲密关系
    • 5.1 不读入内存就无法运行
    • 5.2 磁盘缓存加快了磁盘访问速度
    • 5.3 虚拟内存把磁盘当做部分内存使用
    • 5.4 节约内存的编程方法
    • 5.5 磁盘的物理结构
    • 6.1 文件以字节为单位保存
    • 6.2 RLE算法的机制
    • 6.3 RLE算法的缺点
    • 6.4 通过摩尔斯编码来看哈夫曼算法的基础
    • 6.5 用二叉树实现哈夫曼编码
    • 6.6 哈夫曼算法能够大幅提升压缩比率
    • 6.7 可逆压缩和不可逆压缩
    • 7.1 运行环境=操作系统加硬件
    • 7.2 windows克服了cpu以外的硬件差距
    • 7.3 不同操作系统的api不同
    • 7.4 freebsd port 帮你轻松使用源代码
    • 7.5 利用虚拟机获得其他操作系统环境
    • 7.6 提供相同运行环境的Java虚拟机
    • 7.7 BIOS和引导
    • 8.1 计算机只能运行本地代码
    • 8.2 本地代码的内容
    • 8.3 编译器负责转换源代码
    • 8.4 紧靠编译无法获得可执行文件
    • 8.5 启动及库文件
    • 8.6 dll文件及导入库
    • 8.7 可执行文件运行时的必要条件
    • 8.8 程序加载时会生成栈和堆
    • 9.1 操作系统功能的历史
    • 9.2 要意识到操作系统的存在
    • 9.3 系统调用和高级编程语言的移植性
    • 9.4 操作系统和高级编程语言使硬件抽象化
    • 9.5 windows操作系统的特征
    • 10.1 汇编语言和本地代码是一一对应的
    • 10.2 通过编译器输出汇编语言的源代码
    • 10.3 不会转换成本地代码的伪指令
    • 10.4 汇编语言的语法是 操作码加操作数
    • 10.5 最常用的mov指令
    • 10.8 函数内部的处理
    • 10.9 始终确保全局变量用的内存空间
    • 10.10 临时确保局部变量用的内存空间
    • 10.11 循环处理的实现方法
    • 10.12 条件分支的实现方法
    • 10.13 了解程序运行方式的必要性
    • 11.1 应用和硬件无关?
    • 11.2 支撑硬件输入输出的in指令和out指令
    • 11.3 编写测试用的输入输出程序
    • 11.4 外围设备的中断请求
    • 11.5 用中断来实现实时处理
    • 11.6 dma可以实现短时间内传送大量数据
    • 11.7 文字及图片的显示机制
    • 12.1 作为工具的程序和为了思考的程序
    • 12.2 用程序来表示人的思考方式
    • 12.3 用程序来表示人类的思考习惯
    • 12.4 程序生成随机数的方法
    • 12.5 活用记忆功能以达到跟接近人类的判断
    • 12.6 用程序表示思维模式

cpu是啥

1.0 cpu是什么+

  1. 程序是什么?
    指示计算机每一步动作的一组指令

  2. 程序是由什么组成的?
    指令和数据
    程序是指令和数据的组合体。例如,C 语言“printf (" 你好 “);”这个简单的程序中,printf 是指令,” 你好 " 是数据。

  3. 什么是机器语言?
    cpu可以直接识别并使用的语言

  4. 正在运行的程序存储在什么位置?
    内存
    硬盘和磁盘等媒介上保存的程序被复制到内存后才能运行。

  5. 什么是内存地址?
    内存中用来表示数据和命令存储位置的数值
    内存中保存命令和数据的场所,通过地址来标记和指定。地址由整数值表示。

  6. 计算机的构成元件中,负责程序的解释和运行的是哪个?
    cpu
    计算机的构成元件中,根据程序的指令来进行数据运算,并控制整个计算机的设备称作 CPU。大家熟知的奔腾(Pentium)就是 CPU 的一种。

程序员还需要理解 CPU 是如何运行的,特别是要弄清楚负责保存指令和数据的寄存器的机制。了解了寄存器,也就自然而然地理解了程序的运行机制。可能有很多读者会认为 CPU 的运行机制比较难,其实它非常简单。

1.1 cpu的内部结构

CPU 1所负责的就是解释和运行最终转换成机器语言的程序内容。
cpu由具有on\off功能的晶体管构成,有的cpu在集合电路中集合了两个cpu芯片 称为双核cpu

程序员用高级语言编写程序
编译并解释成机器语言exe文件
程序运行时,在内存中生成exe文件的副件
cpu进行解释并执行程序内容

cpu和内存是由很多晶体管组成的电子部件 通常被称为ic (集成电路)
cpu由寄存器 控制器 运算器 时钟组成 各部分由电流信号相互连接
寄存器负责暂存数据和指令等处理对象,类似内存 每个cpu由20-100个寄存器
控制器负责将内存里的数据和指令读入到寄存器 并根据指令的执行结果控制计算机2w
运算器运算从内存读入寄存器的数据
时钟发出cpu开始计时的时钟信号

2时钟信号英文叫作 clock puzzle。Pentium 2 GHz 表示时钟信号的频率为 2 GHz(1 GHz = 10 亿次 / 秒)。也就是说,时钟信号的频率越高,CPU 的运行速度越快。

内存指的是计算机的主储存器 储存数据和指令 主存通过控制芯片和cpu相连
主存有可读写的元素组成 每个字节都有地址编号
cpu通过该地址编号可以读取主存中的指令和数据 当然也可以写入
不过主存中的数据会随计算机的关机自动删除

主存位于计算机内部 储存程序 数据等 通常使用DRAM芯片 需要稳定的供电 并刷新 (最新数据)
关机后内容自动删除

程序启动后 通过时钟信号 控制器从内存中读取的数据和指令 通过对这些指令进行解释和运行 运算器对数据进行计算 控制器通过得出的结果进行控制

其实所谓的控制就是指数据运算以外的处理(主要是数据输入输出的时机控制)。比如内存和磁盘等媒介的输入输出、键盘和鼠标的输入、显示器和打印机的输出等,这些都是控制的内容。

1.2 cpu是寄存器的集合体

为什么必须要了解寄存器呢?这是因为程序是把寄存器作为对象来描述的。
通常我们将汇编语言编写的程序转化成机器语言的过程称为汇编;反之,机器语言程序转化成汇编语言程序的过程则称为反汇编。

机器语言级别的程序是通过寄存器来处理的。也就是说,在程序员看来“CPU 是寄存器的集合体”。至于控制器、运算器和时钟,程序员只需要知道 CPU 中还有这几部分就足够了。

汇编语言是 803867以上的 CPU 所使用的语言。eax 和 ebp 是 CPU 内部的寄存器的名称。内存的存储场所通过地址编号来区分,而寄存器的种类则通过名字来区分。

使用高级语言编写的程序运行后会编译成机器语言 然后通过寄存器处理

寄存器中储存的既可以是数据也可以是指令 其中 数据分为 用于计算的数据 和 表示内存地址的数值
数据种类不同 用来储存的寄存器就不同 cpu每个寄存器的功能都不同

对程序员来说,CPU 是什么呢?如图 1-3 所示,CPU 是具有各种功能的寄存器的集合体。其中,程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其他的寄存器一般有多个。程序计数器和标志寄存器比较特殊,这一点在后面的章节中会详细说明。另外,存储指令的指令寄存器等寄存器,由于不需要程序员做多关注,因此图 1-3 中没有提到。

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

存储指令和数据的内存 是通过地址来划分的
cpu执行0100的地址后 程序计数器就变成0101 (若一个指令指向多个地址 增加地址长度)
程序计数器决定程序的流程

1.4 条件分支和循环机制

程序的流程分为顺序执行 条件分支和循环
顺序执行指按照地址内容的顺序执行指令
条件分支指按照条件执行任意地址的指令
循环 重复执行同一地址的指令

无论当前累加寄存器的结果是正负0 或者溢出 奇偶校验 标志寄存器都会保存

PU 执行比较的机制很有意思,因此请大家务必牢记。例如,假设要比较累加寄存器中存储的 XXX 值和通用寄存器中存储的 YYY 值,执行比较的指令后,CPU 的运算装置就会在内部(暗中)进行 XXX-YYY 的减法运算。而无论减法运算的结果是正数、零还是负数,都会保存到标志寄存器中。结果为正表示 XXX 比 YYY 大,零表示 XXX 和 YYY 相等,负表示 XXX 比 YYY 小。

1.5 函数的调用机制

函数调用也是通过将程序计数器的值设定为函数的存储地址来实现的
函数的调用需要在完成函数内部的处理后 处理流程再返回到函数调用点

函数调用的处理用call命令 结束的处理转换为return命令

call命令会把函数结束后的地址储存在栈
函数结束后用return命令将栈中的地址输入到程序计数器中

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

通过基址寄存器和变址寄存器可以实现类似数组的操作

数组是和多个数据相同长度的 用数组名表示整个数组 索引表示每个数据

用16进制数将xxx划分出来 可以将10000存入基址寄存器 使变址寄存器的数值在000000-00xxxx变化
cpu会把基址寄存器的值和变址寄存器的和解释为实际查看的内存地址 变址寄存器就像数据中的索引

1.7 cpu的处理其实很简单

CPU 可以进行的处理非常少。虽然高级编程语言编写的程序看起来非常复杂,但 CPU 实际处理的事情就是这么简单

2.0 数据是用二进制表示的

  1. 32 位是几个字节 ?

  2. 二进制数 01011100 转换成十进制数是多少?

  3. 二进制数 00001111 左移两位后,会变成原数的几倍?

  4. 补码形式表示的 8 位二进制数 11111111,用十进制数表示的话是多少?

  5. 补码形式表示的 8 位二进制数 10101010,用 16 位的二进制数表示的话是多少?

  6. 反转部分图形模式时,使用的是什么逻辑运算?

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

计算机是由IC组成的 (集成电路 )cpu和内存也是ic的一种

引脚在ic中并列排列着 每个引脚只能表示0v和5v 只能表示两种状态

计算机处理信息的位是二进制的一位 位的英文bit是二进制数位的缩写

二进制数的位数一般是八的倍数
八位2进制数被称为一个字节 字节是最基本的信息计量单位 位是最小的单位 字节是基本单位
内存和磁盘都使用字节 位无法使用

若数据小于存储数据的位数 如100200 变为00100200 用16位表示00000000xxx
奔腾等32位微处理器可以一次32位的二进制数

对二进制数的处理 取决于程序的编写方式

2.2 什么是二进制


下面我们会对照着十进制数来说明二进制数的机制,这部分是重点,请大家一定要掌握。

其实大家所说的数值,表示的就是构成数值的各数位的数值和位权相乘后再相加的结果。例如 39 这个十进制数,表示的就是 30+9,即各数位的数值和位权相乘后再相加的数值。

这种思考方式在二进制数中也是通用的。二进制数 00100111 用十进制数表示的话是 39,因为(0×128)+(0×64)+(1×32)+(0×16)+(0×8)+(1×4)+(1×2)+(1×1)= 39。

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

二进制数所特有的运算,也是计算机所特有的运算,因此可以说是了解程序运行原理的关键。

十进制数左移后会变成原来的 10 倍、100 倍、1000 倍……同样,二进制数左移后就会变成原来的 2 倍、4 倍、8 倍……反之,二进制数右移后则会变成原来的 1/2、1/4、1/8……这样一来,大家应该能够理解为什么移位运算能代替乘法运算和除法运算了吧。

2.4 便于计算机处理的补数

二进制中表示 正负 一般用最高位 0是正 1是负

计算机在做减法运算时,实际上内部是在做加法运算。用加法运算来实现减法运算,是不是很新奇呢?为此,在表示负数时就需要使用“二进制的补数”。补数就是用正数来表示负数,很不可思议吧。

为了获得补数 需要将二进制每一位都取反然后加1

对于溢出的位 计算机会忽略

1+(-1)
00000001 + 11111111 = 100000000 溢出会忽略 =0

3-5 得出的结果是11111110 是一个负数 想知道结果 就需要再补数
得到00000010 也就是-2

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

逻辑右移就像霓虹灯一样 在最高位补0

将 二进制当做有符号的数值时 在最高位补0或1
为正数 0 若是用补数表示的负数 1

将11111111的补数扩成16位 111111111111111111

2.6 掌握逻辑运算的窍门

计算就是算术 图形就是逻辑

逻辑非 都取反
逻辑与 都为1时结果1
逻辑或 有一个是 1结果1
逻辑异或 有一个1一个0结果为1

3.0 计算机进行小数运算计算错误的原因

  1. 二进制数 0.1,用十进制数表示的话是多少?
    1x2 -1 = 0.5

  2. 用小数点后有 3 位的二进制数,能表示十进制数 0.625 吗?
    0.101

  3. 将小数分为符号、尾数、基数、指数 4 部分进行表现的形式称为什么?
    .浮点数是指把小数用“符号 尾数 × 基数的指数次幂”这种形式来表示。

  4. 二进制数的基数是多少?
    2

  5. 通过把 0 作为数值范围的中间值,从而在不使用符号位的情况下来表示负数的表示方法称为什么?
    excess系统表现

  6. 10101100.01010011 这个二进制数,用十六进制数表示的话是多少?
    整数部分和小数部分一样,二进制数的 4 位,就相当于十六进制数的 1 位。

3.1 0.1累加100次也得不到10

程序没错,计算机也没有发生故障,当然,C 语言也没有什么问题。可为什么会出现这样的结果呢?这时,如果考虑一下计算机处理小数的机制,就讲得通了。那么,计算机内部是如何处理小数的呢?

3.2 用二进制表示小数

这一规律并不仅限于二进制数,在十进制数和十六进制数中也同样适用

3.3 计算机运行出错的原因

有一些十进制的数字无法转化为二进制

3.4 什么是浮点数

浮点数指的是用符号 尾数 基数 指数表示的

双精度和单精度表示同一个数值时使用的位数不同 双精度的范围更大

数据位0表示0或正 1表示负

3.5 正则表达式和excess系统

用特定的规则来表达是正则表达式

整数只有一个1 其他都是0

excess表示将指数部分范围中间值设为0 从而使得不需要符号

作为单精度浮点数的示例,表 3-2 中列出了指数部分的实际值和用 EXCESS 系统表现后的值。例如,指数部分为二进制数 11111111(十进制数 255),那么在 EXCESS 系统中则表示为 128 次幂。这是因为 255-127 = 128。因此,8 位的情况下,表示的范围就是 -127 次幂~128 次幂。

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

十进制数 0.75 用单精度浮点数来表示就变成了 0-01111110-10000000000000000000000(图 3-7)
0表示符号 011111110表示128 因为是excess系统 -1 100000000000表示1.100000000000000000

接下来,我们继续使用该程序来看一下如何用单精度浮点数表示十进制数 0.1。运行后就会发现结果为 0-01111011-10011001100110011001101(只需将 data = (float)0.75; 的部分变成 data = (float)0.1; 即可)。这时,如果反过来计算一下这个数值的十进制数,估计大家又要冒汗了,结果居然不是 0.1。

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

原因之一是用浮点数表示小数

将小数扩大成整数 最后除回来

涉及到必须准确 用换整数或bcd方法

3.8 十六进制

在数值前只要加上0x 表示十六进制

二进制4位表示一位十六进制 小数点后四位 补0就行

4.0 熟练使用有棱有角的内存

  1. 有十个地址信号引脚的内存 IC(集成电路)可以指定的地址范围是多少?

  2. 高级编程语言中的数据类型表示的是什么?

  3. 在 32 位内存地址的环境中,指针变量的长度是多少位?

  4. 与物理内存有着相同构造的数组的数据类型长度是多少?

  5. 用 LIFO 方式进行数据读写的数据结构称为什么?

  6. 根据数据的大小链表分叉成两个方向的数据结构称为什么?

4.1 内存的物理机制很简单

内存ic中有 电源 地址信号 控制信号 数据信号 大量引脚 通过为其指定地址 来进行地址的读写

1024个字节 = 1kb

地址用来表示存储的区域 表示容量 例1kb

4.2 内存的逻辑模型是楼房

一层存储一个字节 楼层号是地址


变量的数据结构不同 所占用的内存也不同

4.3 简单的指针

理解指针的关键在于理解数据结构

计算机通常有32位内存地址 这样 指针变量的长度也是32位

假设指针def都是100 那char d 就是100 地址的数据 short e是100和101的数据

4.4 数组是高效使用内存的基础

数组是指多个相同数据类型的数据在内存中连续排列的形式
各个数据通过连续的编号区分开 叫索引
索引和内存地址的转换是由编码器实现的

char g【100】 表示 g【0】-g[99

4.5 栈 队列 以及环形缓冲区

栈和队列都可以不通过指定地址和索引来对数组的数据进行读写

栈和队列的区别是数据出入的顺序是不同的
栈是后入先出 队列是先入先出

要在程序中实现 栈和队列 需要适当的元素数来定义一个用来存储数据的数组 以及对该数组进行读写的函数组

队列一般是环形缓冲区

一个圈 一边读出一边写入

4.6 链表使元素的追加和删除更容易

链表和二叉查找树都是不用考虑索引的顺序就可以对数据进行读写的方式
通过链表可以更高效的对数组数据进行追加和删除处理
二叉查找树可以更加高效的对数组数据进行检索

数组的元素通常是按照索引顺序来引用的

4.7 二叉查找树使数据搜索更有效

二叉查找树是指在链表的基础上往数组中追加元素时 考虑数据的大小 将其分为左右
新的大就在右边 小就左边

二叉查找树可以使数据的搜索更有效率
目标数据比较小就走左侧 大就右侧 加快速度

5.0 内存和磁盘的亲密关系

内存是利用电流来实现存储
磁盘利用磁效应
内存是高价加速
磁盘低速廉价

内存主要指主内存 负责储存cpu运行的程序指令和数据的内存
磁盘主要是硬盘

5.1 不读入内存就无法运行

程序保存在存储机制 有序的被读出来实现运行
被称为存储程序方式

存储在磁盘里的程序要读入到内存才能运行

5.2 磁盘缓存加快了磁盘访问速度

磁盘缓存指把磁盘的数据储存到内存空间中 大大改善磁盘数据的访问速度

web浏览器也是一个原理

5.3 虚拟内存把磁盘当做部分内存使用

通过虚拟内存 可以使内存不足时 也可以运行程序

虚拟内存是吧磁盘的一部分作为假想的内存来使用 这和磁盘缓存是相对的

为了实现虚拟内存 必须把实际内存和磁盘上虚拟内存的内容进行部分置换 并同时运行程序

虚拟内存的方法有两种 分页式和分段式

把运行的程序以页为单位 进行分割 在磁盘和内存之间置换

5.4 节约内存的编程方法

虚拟内存无法根本解决内存不足的问题

1、dll文件使用函数共有
dll文件 程序运行时可以动态运行library (函数和数据的集合)
多个程序可以共用一个dll

windows本身也有多个dll dll在exe文件不变的情况 升级可以更新

2、通过调用_stdcall来减少程序文件的大小

c语音中函数返回值是通过寄存器而不是栈

栈清理处理 比起在函数调用方 在反复被调用的函数方更 程序更小
函数前加_stdcall 就可以把栈清理用在被调用函数一方

5.5 磁盘的物理结构

磁盘是通过把表面划分为多个区域完成的
划分方式有 扇区方式和可变长方式

一般windows硬件软件都是扇区方式

扇区是对磁盘进行物理读写的最小单位
一般一个扇区是512字节

windows在逻辑方面(软件)对磁盘进行读写的方式是扇区整数倍簇
根据磁盘容量不同 一簇可以是一扇区 二 三
软盘 一簇就是一扇区

不同的文件不能储存在一簇中

6.1 文件以字节为单位保存

文件是将数据储存在磁盘等的形式
文件以b 字节为单位储存的

任何情况下 文件中的字节数据都是连续存储的

6.2 RLE算法的机制

把文件内容用数据*次数的表示方法就是rle算法
经常用于压缩传真的图像

6.3 RLE算法的缺点

文本重复的很少

6.4 通过摩尔斯编码来看哈夫曼算法的基础

哈夫曼算法的关键在于 将多次出现的字符用低位表示 少的用多的表示
不管是不满八位的哈斯超过八位的数据最后都是以八位位单位保存到文件中

字符种类的不同 莫尔斯编码的长度也不同

6.5 用二叉树实现哈夫曼编码

哈夫曼编码指为为每个文件制定适合的编码体系 来进行压缩

借助哈弗曼树构造编码体系 不用加区分符号就可以区分

6.6 哈夫曼算法能够大幅提升压缩比率

哈夫曼算法以位为单位对数据进行排查

6.7 可逆压缩和不可逆压缩

7.1 运行环境=操作系统加硬件

操作系统和硬件决定程序的运行环境

机器语言的程序被称为本地代码

程序员编写的程序 编写阶段是文本文件 被称为源文件
对源代码编译成本地代码

7.2 windows克服了cpu以外的硬件差距

应用软件可以控制计算机的硬件
原因是 一 当时ms-dos的功能并不完善
二 程序可以更快

只要windows能运行 应用能在不同的机型运行

windows中 键盘显示器不是向硬件发送指令 是向windows发送指令间接实现的

即使是windows 也无法吸收cpu的差异 因为 市面上的windows软件都是 用特定的cpu本地代码完成的

7.3 不同操作系统的api不同

应用程序必须根据不同的操作系统来设计

cpu的类型不同 机器语言也不同 相同 操作系统不同 应用程序向操作系统传递指令的途径也不同

应用程序对操作系统传递指令的方式称为api

同样的程序移到其他操作系统就需要重写api
外围设备都是通过api

同类型操作系统 不管硬件如何 api基本相同 所以在任何硬件都能运行

cpu不同 所以本地代码不同 需要生成各cpu专用的本地代码的编译器 来对源代码进行编译

程序是由操作系统和硬件决定的

7.4 freebsd port 帮你轻松使用源代码

unix操作系统FreeBSD 存在一种名为ports的机制
能够结合当前运行的硬件环境来编译应用的源代码
得到可以运行的本地代码

若目标应用的源代码不在硬件中 就用ftp协议在网络下载代码

port能够克服包括cpu的所有硬件系统的差异

7.5 利用虚拟机获得其他操作系统环境

7.6 提供相同运行环境的Java虚拟机

java也是将源代码编译后使用 不过编译后不是机器代码而是字节代码
java虚拟机就是一边把java字节代码转换成本地代码一边运行的

不过不同java虚拟机之间无法完全替换 想让所有字节代码在所有java虚拟机都运行是很困难的
运行速度不快

7.7 BIOS和引导

程序的运行环境中有名为bios的系统

bios储存在rom中 是预先预存在计算机内部的程序
bios除了磁盘 键盘显卡等基本控制程序外 还有启动引导程序的功能

引导程序是储存在启动驱动盘起始区域的小程序

开机后 bios会确认是否正常启动 没有问题就启动引导程序
引导程序把在硬盘等记录的os加载到内存中运行
启动程序是os的功能 但他不能启动自己
而是通过引导程序

8.1 计算机只能运行本地代码

编码语言编写的程序被称为源代码 保存源代码的文件叫源文件

不同语言编写的代码,转换成本地代码后 都变成一种语言了

8.2 本地代码的内容

本地代码人类无法理解

将exe文件dump一下
dump指把文件内容 每个字节用2位16进制数表示

每个数值都表示一个命令或数据

8.3 编译器负责转换源代码

将源代码转换为本地代码的叫做编译器

仅靠对照表无法生成代码 还需要语法分析 语句分析等

编译器不仅和编程语言有关 还和cpu有关

编译器也是程序的一种 所以也需要运行环境

还有一种交叉编译器 生成和运行环境不同的cpu使用的本地代码

8.4 紧靠编译无法获得可执行文件

为了得到可运行的exe文件 编译后还需要进行链接处理

将多个目标文件组合成一个exe文件叫链接
运行连接的程序叫链接器

8.5 启动及库文件

目标文件记述得是同所有程序起始位置结合的处理内容 称为程序的启动
即使程序不调用其他目标文件的函数 也必须链接 和启动结合起来

库文件表示 把多个目标文件集合到一个文件中

外部符号指其他目标文件中的变量或函数

sprintf等函数 不是通过源代码形式 而是通过库文件形式和编译器一起提供的
这样的函数被称为标准函数

8.6 dll文件及导入库

windows以函数的形式为应用提供了各种功能 这些形式的函数叫api(应用程序接口)

windows中 api并不是储存在通常的库文件中 而是储存在dll文件的特殊库文件中

dll是程序运行时动态结合的文件

我们把类似于impr这样的库文件称为导入库

与此相反 储存着目标文件的实体 并直接与exe文件结合的文件形式叫静态链接库

储存着sprintf的目标文件的就是静态链接库
sprintf通过指定格式把数值转换为字符串

8.7 可执行文件运行时的必要条件

exe文件是作为单独的文件储存在硬盘上的

exe文件给变量和函数分配了虚拟的内存地址
链接器会在exe文件的开头 追加转换内存地址的必要内容
这个信息被称为在配置信息

exe文件的在配置信息 成为了变量和函数的相对地址

8.8 程序加载时会生成栈和堆

exe文件的内容分为在配置信息 函数组 变量组

程序加载到内存后 还会生成两个组 栈和堆

栈是用来存储函数内部的临时使用的变量和 函数调用时所用的参数的内存空间

堆是用来储存程序运行时任意生成的数据及对象的内存领域

堆和栈的内存空间是程序在exe文件加载到内存时得到分配的
内存中的程序是由 用于函数、变量、栈 堆的内存空间组成的

栈对数据的代码 是编译器自动生成的
堆是程序员控制的

为了提高特定处理效率的程序统称为应用

9.1 操作系统功能的历史

具有加载和运行功能的监控程序 这就是操作系统的原型

操作系统本身并不是单独的程序 而是多个程序的集合体

9.2 要意识到操作系统的存在

全面的程序员 掌握基本的硬件知识 并借助操作系统进行抽象化 大大提高编程效率

应用的可执行文件指的是 计算机的cpu可以直接解释并运行的本地代码

应用并不是直接控制硬盘 而是通过操作系统间接控制硬件

9.3 系统调用和高级编程语言的移植性

操作系统的硬件控制功能 通常是通过一些小的函数集合体的形式提供的
这些函数及调用函数的行为统称为系统调用

高级编程语言的机制就是 使用独自的函数名 再在编译的时候将其转换成对应操作系统的系统调用

9.4 操作系统和高级编程语言使硬件抽象化

9.5 windows操作系统的特征

1、32位操作系统(64)
可以毫无忌惮的使用32位的数据

2、通过api函数集来提供函数调用
windows是用过api的函数集来提供系统调用的
api是联系应用程序和操作系统的接口 所以称为api

win32中 函数的返回值和参数值都是32

api通过多个dll文件来提供

3、提供采用了gui的用户界面
gui指的是通过点击显示器显示的窗口和图标等进行可视化操作的用户界面

gui中的程序需要程序员制作出任何操作顺序都要能运行的应用

4、通过wysiwyg 实现打印输出
指的是显示器的内容可以通过打印机打印输出

一个程序可以实现显示和打印

5、提供多任务功能
多任务指的是同时运行 windows是通过时钟分割技术来实现多任务功能的

6、提供网络功能和数据库功能
网络功能和数据库功能被统称为中间件而不是应用
意思是处在操作系统和应用的中间
操作系统和中间件在一起称为系统软件
应用可以利用中间件

中间件可以替换 但不容易

7、通过即插即用实现设备驱动的自动设定
即插即用指的是新设备连接后立刻就可以使用
系统会自动安装和设定用来控制该设备的设备驱动程序

可以任意追加api和设备驱动的机制使win变得非常灵活

程序是操作系统 中间件 应用所有软件的总称
程序员制作的应该都是应用

10.1 汇编语言和本地代码是一一对应的

使用助记符的编程语言叫汇编语言

汇编语言编写的源代码最后也要转为本地代码才能运行

汇编语言和本地代码是一一对应的
本地代码可以转为汇编代码

这功能叫反汇编

c语言的源代码和本地代码不是一一对应的 所以还原到c几乎不可能

10.2 通过编译器输出汇编语言的源代码

大部分c语言编译器都可以把c转为汇编语言

汇编语言源文件的扩展名 通常是.asm

10.3 不会转换成本地代码的伪指令

汇编语言的源代码 是由转换成本地代码的指令和针对汇编器的伪代码构成的

伪指令负责把程序的构造和汇编的方法指示给汇编器 但无法汇编成本地代码

段定义 程序的命令和数据的集合体 一个程序是由多个段定义构成

栈和堆 的内存空间会在程序运行时生成

在汇编语言中 相当于c语言函数的形式称为过程

10.4 汇编语言的语法是 操作码加操作数

汇编语言中存在多个操作数的情况下 要用逗号把他们分割开

能够使用何种类型的操作码 由cpu的种类决定

内存中存储着构成本地代码的指令和数据
程序运行时 cpu会把数据和指令读出 储存到寄存器中进行处理

寄存器不仅仅有存储功能 还有运算功能
也有程序员无法直接操作的寄存器

10.5 最常用的mov指令

指令中最常用的是对寄存器和内存进行存储的mov指令

10.8 函数内部的处理

函数的参数是通过栈来传递 返回值是通过寄存器来返回的

10.9 始终确保全局变量用的内存空间

c中 在函数外部定义的变量是全局变量 内部是局部变量

全局变量可以在任何地方引用 局部只能函数内部使用

10.10 临时确保局部变量用的内存空间

局部变量是临时保存在寄存器和栈中的

寄存器空闲就先用 然后用栈

10.11 循环处理的实现方法

10.12 条件分支的实现方法

10.13 了解程序运行方式的必要性

为避免bug 可采用以函数等行为来禁止线程切换的锁定方法

厉害程序员要有一次汇编代码编写的经验

11.1 应用和硬件无关?

硬件的控制是由windows全权负责

利用操作系统提供的系统调用可以实现对硬件的控制
系统调用被称为api 各api就是应用调用的函数
这些函数的实体被储存在dll文件中

11.2 支撑硬件输入输出的in指令和out指令

window控制硬件时借住的是输入输出指令
最具代表性的是in out
这些指令也是汇编语言的助记符

in指令通过指定的端口输入数据 储存在cpu内部的寄存器中
out指令将cpu储存器的数据 输出到端口

用来交换计算机与外围设备的电流特性的 ic 叫I\O控制器

input\output
i\o控制器有用来保存临时数据的内存 叫做端口

一个i\o控制器可以控制多个外围设备
各端口之间通过端口号区分

11.3 编写测试用的输入输出程序

11.4 外围设备的中断请求

irq是中断请求的意思

irq是用来暂停正在运行的程序 并跳转到其他程序 称为中断处理

实施中断请求的是i\o控制器 实施的是cpu
外围设备的中断请求会使用不同的其他编号 叫中断编号

中断处理程序的第一步就是把寄存器的数据保存在栈中

11.5 用中断来实现实时处理

按照顺序调查多个外围设备的状态叫轮询

11.6 dma可以实现短时间内传送大量数据

dma指外围设备和主内存直接传输数据 省去了cpu的环节

I\o端口号 dma irq是识别外围设备的三大要素

11.7 文字及图片的显示机制

显示器显示的信息一致储存在内存中 这内存叫vram

计算机能处理的事 始终是把输入的数据计算 然后输出 这是不会变的

12.1 作为工具的程序和为了思考的程序

控制就是cpu和各种设备配合对数据输入输出

程序一般有两个目的 用来当工具 用来代替人思考

12.2 用程序来表示人的思考方式

12.3 用程序来表示人类的思考习惯

12.4 程序生成随机数的方法

用公式产生的随机数具有一定的规律 称为伪随机数

线性同余法
时间作为随机数的种子

12.5 活用记忆功能以达到跟接近人类的判断

12.6 用程序表示思维模式

程序是怎么跑起来的 | 个人笔记相关推荐

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

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

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

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

  3. 《程序是怎样跑起来的》(上)

    学习笔记 此书前言 无论任何事情,了解其本质非常重要.只有了解了本质才能提高利用效率.这样一来,即使有新技术出现,也能很容易的理解并掌握. 第1章 对程序员来说CPU是什么 本章提问 程序是什么? 程 ...

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

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

  5. rw_程序是怎样跑起来的 7-12章

    2016.10.26 - 11.01 <程序是怎样跑起来的>7-12章 - 矢泽久雄 / 著 - 李俊峰 / 译 个人学习笔记. 虽然计算机领域新技术在不断涌现,但计算机能处理的事情始终是 ...

  6. 程序员的职业素养(读书笔记)-- 第一章

    程序员的职业素养(读书笔记) 第1 章 专业主义 1.1 清楚你要什么 "专业主义"有很深的含义,它不但象征着荣誉与骄傲,而且明确意味着责任 与义务.这两者密切相关,因为从你无法负 ...

  7. c语言小程序跑马灯,微信小程序实现文字跑马灯效果

    本文实例为大家分享了微信小程序实现文字跑马灯的具体代码,供大家参考,具体内容如下 wxml 1 显示完后再显示 Box"> 2 出现白边后即显示 Box"> {{tex ...

  8. 读《程序是怎样跑起来的》第一章有感

    程序是怎样跑起来的,一听名字就特别吸引人注意,想要翻开书一探究竟. 首先,我学习了这本书的第一章,"对程序员来说CPU是什么",刚一看到这个标题,我只知道CPU是计算机的运算核心和 ...

  9. 好程序员web前端分享Nodejs学习笔记之Stream模块

    好程序员web前端分享Nodejs学习笔记之Stream模块 一,开篇分析 流是一个抽象接口,被 Node 中的很多对象所实现.比如对一个 HTTP 服务器的请求是一个流,stdout 也是一个流.流 ...

最新文章

  1. 电子计算机的发展与应用教案,川教版信息技术七上第3课《电子计算机的发展与应用》教案1.doc...
  2. 关于Block Formatting Context--BFC和IE的hasLayout
  3. NETMF Versions 4.1 Release 发布
  4. java 映射类_将数据库类型映射到具体的Java类
  5. oracle %date 0 10%,“date:~0,10%“是什么意思?
  6. 爱情二十九课,驾驭爱情
  7. python到包快捷键_如何最简单、通俗地理解Python的包?
  8. Python微调文本顺序对抗朴素贝叶斯算法垃圾邮件分类机制
  9. 《Qt 数据库详解》博客系列文章
  10. 美团败诉,赔偿饿了么 100 万元;华为 Mate X2 首发秒没;库克获 8 亿年终奖 | 极客头条...
  11. 像人类一样理解言外之意,阿里AI最新研究成果被国际顶会收录
  12. [开源]基于WPF实现的Gif图片分割器,提取GIf图片中的每一帧
  13. 计算机dns无法修改,Win7系统怎么改DNS地址 修改电脑DNS地址教程具体介绍
  14. 在商业化这件事上,百度Apollo智能车联究竟做得怎么样了?
  15. 今天正式开始做毕业设计——自助装机系统
  16. 工控安全-工控安全案例
  17. 在godaddy上注册的域名安全吗?
  18. IMS 注册流程最新
  19. java位运算符和位运算表达式
  20. 推荐系统从入门到实战笔记

热门文章

  1. HotSpot的经典垃圾收集器
  2. 离开国企继续前(chu)进(chou )——北漂18年(34)
  3. mysql 学习笔记第二天 排序查询(超级好懂分享给大家)
  4. mobilenet系列之又一新成员---mobilenet-v3
  5. C++ ostringstream
  6. 50种制作图表JS库
  7. 川大计算机应用基础第二次作业,川大计算机应用基础第二次作业-20210331054635.docx-原创力文档...
  8. 国外一些知名的网盟、返利网平台,赚钱的底层逻辑是怎么样的?
  9. 程序员:1行代码修改开机密码、1张图片让电脑死机
  10. Stream流reduce方法