计算机组成原理入门开始
明天学学markdown吧,csdn又抽风
学习还是同时学几门比较好,这一门学累了就转学下一门^^
书中涉及的关键词一览
![](https://i-blog.csdnimg.cn/blog_migrate/3ccdceec6b6913c3c8bbe7a545b73641.png)
![](https://i-blog.csdnimg.cn/blog_migrate/9e010cff68d0b23f2f38b41fea9e5a0e.png)
对程序员来说CPU是什么
CPU是由控制器 运算器 时钟 寄存器 组成的
程序中的比较指令,就是在CPU内部做减法运算
return命令的功能是把保存在栈中的地址设定到程序计数器中
数据是用二进制数表示的
IC是集成电路的简称
补数求解方法 : 取反 + 1
无符号右移 逻辑右移 , 有符号右移 算术右移
![](https://i-blog.csdnimg.cn/blog_migrate/e7431cb31e95580e613f0046010d9ed1.png)
计算机进行小数运算时出错的原因
![](https://i-blog.csdnimg.cn/blog_migrate/b9265bc1539d09d66810f7defce3007f.png)
浮点数的表现形式。由符号,尾数,基数,指数四部分构成
![](https://i-blog.csdnimg.cn/blog_migrate/428fca871f26165d687880595f965530.png)
IEEE
![](https://i-blog.csdnimg.cn/blog_migrate/23a40f5fe4ce96f2d6abf66b954c6763.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3613ad8425e2cf0190f7c2899b0ffb2c.png)
熟练使用有棱有角的内存
向内存IC中写入和读出数据的方法
![](https://i-blog.csdnimg.cn/blog_migrate/67093c92a1f90d728dc621bb82cb99b8.png)
内存的逻辑模型是楼房
![](https://i-blog.csdnimg.cn/blog_migrate/9bb8b238b4e66c1b29a93bb7145c489b.png)
内存和磁盘的亲密关系
程序要加载到内存后才能运行
虚拟内存把磁盘作为部分内存来使用
虚拟内存是指把磁盘的一部分作为假想 的内存来使用。这与磁盘缓存是假想的磁盘(实际上是内存)相对,虚 拟内存是假想的内存(实际上是磁盘)
通过借助虚拟内存,在内存不足时也可以运行程序
![](https://i-blog.csdnimg.cn/blog_migrate/dd5e7690b46693749486caaf42802958.png)
节约内存的编程方法
通过DLL文件实现函数共有
DLL(Dynamic Link Library)文件,是在程序运行时可以动态加载Library(函数和数据的集合)的文件,多个应用可以共有一个DLL文件,通过共有可以达到节约内存的效果
在不变更EXE文件的情况下,只通过升级DLL文件就可以更新
通过调用_stdcall来减小程序文件的大小
_stdcall 是 standard call(标准调用)的略称
C 语言中,在调用函数后,需要执行栈清理处理指令。栈清理 处理是指,把不需要的数据从接收和传递函数的参数时使用的内存 上的栈区域中清理出去。该命令不是程序记述的,而是在程序编译 时由编译器自动附加到程序中的。编译器默认将该处理附加在函数 调用方。
栈清理处理,比起在函数调用方进行,在反复被调用的函数一方进 行时,程序整体要小一些。这时所使用的就是 _stdcall。在函数前加上 _stdcall,就可以把栈清理处理变为在被调用函数一方进行。把代码清单 5-1 中的 int MyFunc(int a, int b) 部分转成 int _stdcall MyFunc(int a, int b) 进行再编译后,和代码清单 5-2 中 add esp, 8 同样的处理就会在函数 MyFunc() 一方执行。虽然该处理只能节约 3 个字节(add esp, 8 是机器语
的 3 个字节)的程序大小,不过在整个程序中还是有效果的
亲自尝试压缩数据
图像文件的数据形式以及文件的压缩机制
RLE算法
![](https://i-blog.csdnimg.cn/blog_migrate/3d7568e955ccec8478f2d25066c4f9ae.png)
可想而知的结果
![](https://i-blog.csdnimg.cn/blog_migrate/70eb26cbff7e5eadef0899da9e129ebf.png)
通过莫尔斯编码来看哈夫曼算法的基础
哈夫曼算法:多次出现的数据用小于8位的字节数来表示
![](https://i-blog.csdnimg.cn/blog_migrate/1dea60dfb99cb8f1ca542e53427dd0c2.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ad1f5ba46ca4f1fe098eefc643782c84.png)
用二叉树实现哈夫曼编码
哈夫曼算法是指,为各压缩对象 文件分别构造最佳的编码体系,并以该编码体系为基础来进行压缩。
![](https://i-blog.csdnimg.cn/blog_migrate/3def6ed18bb359909252de65d9c4e544.png)
哈夫曼树的编码
压缩比率较高
![](https://i-blog.csdnimg.cn/blog_migrate/b422f1e2b6fbc51c747f25ef3dec0eed.png)
可逆压缩和非可逆压缩
Windows的标准图像是BMP(bitmap),是完全未压缩的
程序是在何种环境中运行的
Windows应用程序的本地代码,通常是EXE文件以及DLL等形式
![](https://i-blog.csdnimg.cn/blog_migrate/b80a4a914a3e489ad619ada0b52d9c69.png)
Windows克服了CPU以外的硬件差异
![](https://i-blog.csdnimg.cn/blog_migrate/63039e51a163d2f7f665d30cf2ca3abc.png)
应用程序向操作系统传递指令的途径成为API(Application Programming Interface)
BIOS和引导
BIOS(Basic Input/Output System) 程序的运行环境中存在着这样一个系统
存储在ROM中,是预先内置在计算机主机内部的程序
BIOS除了键盘,磁盘,显卡等基本控制程序外,还有启动“引导程序”的功能
引导程序是存储在启动驱动器确实区域的小程序
开机后,BIOS确认硬件正常运行就会启动引导程序,引导程序的功能是把在硬盘等记录的OS
加载到内存中
虽然启动应用是OS的功能,但OS不能自己启动自己
从源文件到可执行文件
计算机只能运行本地代码
保存源代码的文件称为源文件,用C语言编写的源文件的扩展名通常是“.c”
![](https://i-blog.csdnimg.cn/blog_migrate/d0a45b945f6fcf2ab413734016e73b85.png)
能够把C语言等高级编程语言编写的源代码转换成本地代码的程序称为编译器
每个编写源代码的编程语言都需要其专用的编译器
![](https://i-blog.csdnimg.cn/blog_migrate/86e18bf558e17a92ef6e0c7bcc5717dd.png)
仅靠编译是无法得到可执行文件的
编译器转换源代码后,就会生成本地文件,本地文件无法直接运行,为了得到可以运行的EXE文件
编译后还要进行”链接“处理
编译后生成的是扩展名为".obj"的目标文件,目标文件的内容是本地代码,但无法直接运行
把多个目标文件结合,生成一个EXE文件的处理就是链接,运行连接的程序称为链接器
启动及库文件
库文件指的是把多个目标文件集成保存到一个文件中的形式。
链接器指定库文件后就会从中把需要的目标文件抽取出来,并同其他文件结合生成EXE文件
不是通过源代码形式而是通过库文件形式和编译器一起提供的函数称为标准函数
DLL文件及导入库
Windows 中,API 的目标文件,并不是存储在通常的库文件中,而 是存储在名为 DLL(Dynamic Link Library) 文件的特殊库文件中。就如 Dynamic 这一名称所表示的那样,DLL 文件是程序运行时动态结合的 文件。在前面的介绍中,我们提到 MessageBox() 的目标文件是存储在 import32.lib 中的。实际上,import32.lib 中仅仅存储着两个信息,一是 MessageBox() 在 user32.dll 这个 DLL 文件中,另一个是存储着 DLL 文 件的文件夹信息,MessageBox() 的目标文件的实体实际上并不存在。 我们把类似于 import32.lib 这样的库文件称为 导入库
与此相反,存储着目标文件的实体,并直接和 EXE 文件结合的库 文件形式称为静态链接库。静态(static = 静态的)同动态(dynamic = 动态的)是相反的意思。存储着 sprintf() 的目标文件的 cw32lib 就是静 态链接库。sprintf() 提供了通过指定格式把数值转换成字符串的功能
Windows中的编译和链接机制
![](https://i-blog.csdnimg.cn/blog_migrate/f71ce16ff1997c95f937d8c756fa1dae.png)
可执行文件运行时的必要条件
那就是 EXE 文件中给变量及函数分配 了虚拟的内存地址。在程序运行时,虚拟的内存地址会转换成实际的 内存地址。链接器会在 EXE 文件的开头,追加转换内存地址所需的必 要信息。这个信息称为 再配置信息
![](https://i-blog.csdnimg.cn/blog_migrate/a5eb69258fd484c35dcad2d279aa9bbb.png)
程序加载时会生成栈和堆
栈是用来存储函数内部临时使用的变量,以及函数调用时所用的参数的内存区域
堆是用来存储程序运行时的任意数据及对象的内存领域
栈和堆需要的内存是在EXE文件加载到内存后开始运行时得到分配的
![](https://i-blog.csdnimg.cn/blog_migrate/b13bc77d382151dac0c038c846d9d16d.png)
栈中 对数据进行存储和舍弃(清理处理)的代码,是由编译器自动生成的, 因此不需要程序员的参与。使用栈的数据的内存空间,每当函数被调 用时都会得到申请分配,并在函数处理完毕后自动释放。与此相对, 堆的内存空间,则要根据程序员编写的程序,来明确进行申请分配或 释放
如果没有在程序中明确释放堆的内存空间,那么即使在完毕后,该内存空间仍会一直
残留,这个现象叫做内存泄露
一些Q&A
Q :编译器和解释器有什么不同? A :编译器是在运行前对所有源代码进行解释处理的。而解释器则 是在运行时对源代码的内容一行一行地进行解释处理的。 Q :“分割编译”指的是什么? A :将整个程序分为多个源代码来编写,然后分别进行编译,最后 链接成一个 EXE 文件。这样每个源代码都相对变短,便于程序管理。 Q :“Build”指的是什么? A :根据开发工具种类的不同,有的编译器可以通过选择“Build” 菜单来生成 EXE 文件。这种情况下,Build 指的是连续执行编译和链接
Q :使用 DLL 文件的好处是什么? A :DLL 文件中的函数可以被多个程序共用。因此,借助该功能可 以节约内存和磁盘。此外,在对函数的内容进行修正时,还不需要重 新链接(静态链接)使用这个函数的程序
Q :不链接导入库的话就无法调用 DLL 文件中的函数吗? A :通过使用 LoadLibrary() 及 GetProcAddress() 这些 API,即使不 链接导入库,也可以在程序运行时调用 DLL 文件中的函数。不过使用 导入库更简单一些。 Q :“叠加链接”这个术语指的是什么? A :将不会同时执行的函数,交替加载到同一个地址中运行。通过 使用“叠加链接器”这一特殊的链接器即可实现。在计算机中配置的内 存容量不多的 MS-DOS 时代,经常使用叠加链接。 Q :和内存管理相关的“垃圾回收机制”指的是什么呢? A :垃圾回收机制(garbage collection)指的是对处理完毕后不再需 要的堆内存空间的数据和对象 B 进行清理,释放它们所使用的内存空 间。这里把不需要的数据比喻为了垃圾。进行该处理时,C 语言用的是 free() 函数,C++ 用的是 delete 运算符。在 C++ 的基础上开发出来的 Java 及 C# 这些编程语言中,程序运行环境会自动进行垃圾回收。这样 就可以避免由于程序员的疏忽(忘了记述内存的释放处理)而造成内存 泄露了。 A 关于 DLL 文件可以被多个程序共用的好处,第 5 章中有详细介绍。 B 堆中的 object(对象)不是 object 文件(目标文件),而是面向对象编程语 言的 object(对象,数据和处理的集合体