目录
第一章 对程序员来说CPU是什么
问题
-
程序是什么
指示计算机每一步动作的一组指令
-
程序是由什么组成的
指令+数据
-
什么是机器语言
CPU可以直接识别并使用的语言
-
正在运行的程序存储在什么位置
内存
-
什么是内存地址
内存中,用来表示命令和数据存储位置的数据
-
计算机的构成元件中,负责程序解释和运行的是哪个
CPU
CPU:解释和运行最终转换成机器语言的程序内容
组成:
-
寄存器------暂存指令、数据等处理对象-----相当于内存的一种
-
控制器------负责把内存上的指令、数据等读入到寄存器上,并根据指令的执行结果控制整个计算机
-
运算器------负责运算从内存读入到寄存器的数据
-
时钟--------负责发出CPU开始计时的时钟信号
内存(主存):计算机的主存储器。负责存储数据和指令-------CPU根据地址编号读取内存中的数据和指令
整体流程:程序启动后,根据时钟信号,控制器会从内存中读取指令和数据。通过对这些指令加以解释和运行,运算器就会对数据进行运算,控制器根据运算结果控制计算机
汇编语言:采用助记符编写程序
汇编:汇编语言编写的程序转换成机器语言的过程
反汇编:机器语言转换成汇编语言程序的过程
CPU是寄存器的集合体(程序计数器、标志寄存器、累加寄存器……)
程序计数器(决定程序流程):程序运行的位置在0100(Windows系统下),当系统把程序从硬盘复制到内存上,程序计数器会自动设置为0100,CPU每执行一个指令,就会加1。程序计算器决定着程序的流程
顺序执行情况下,每一次指令使得程序计数器的值+1
条件、循环执行情况下,会根据当前执行的运算结果,是否进行跳转指令,同时还会有标志寄存器,保存比较运算的结果
函数调用机制:函数调用也是通过把程序计数器的值设定为函数的存储地址实现,函数在调用之后(完成函数内部的处理之后),处理流程会再次返回函数调用点 函数调用使用call指令,函数的出口使用return指令,call时将执行的指令地址放到栈内存,return的时候取出栈内的地址进行操作
CPU查看的地址:基址寄存器(存储数据内存的起始地址)+变址寄存器(存储数据的相对地址,类似于数组的索引)
机器语言指令的类型和功能
类型 | 功能 |
---|---|
数据转送指令 | 寄存器和内存、内存和内存、寄存器和外围设备之间的数据读写操作 |
运算指令 | 用累加寄存器执行算数运算、逻辑运算、比较运算和移位运算 |
跳转指令 | 实现条件分支、循环、强制跳转等 |
call/return指令 | 函数的调用/返回调用前的地址 |
第二章 数据是用二进制数表示的
问题
-
32位是几个字节?
4字节
-
二进制数01011100转换成十进制数是多少?
92
-
二进制数00001111左移两位后,会变成原数的几倍?
4倍
-
补码形式表示的8位二进制数11111111,用十进制数表示的话是多少?
-1
-
补码形式表示的8位二进制数10101010,用16位的二进制数表示的话是多少?
1111111110101010
-
反转部分图形模式时,使用的是什么逻辑运算?
XOR运算
一个字节=8位二进制
位是最小单位,字节是基本单位
移位运算:将二进制数值的各数位进行左右移位
左移:空出的位置用0填补,左移几位,就是基数的左移数量次方,例如2进制下,左移3位,就是2的三次,扩大了8倍
右移:
补数:”取反+1“,符号位是0表示正数,1表示负数
第三章 计算机进行小数运算时出错的原因
问题
-
二进制数0.1,用十进制表示的话是多少?
0.5
-
用小数点后有3位的二进制数,能表示十进制数0.625
能表示
-
将小数分为符号、尾数、基数、指数4部分进行表现的形式称为什么?
浮点数
-
二进制数的基数是多少?
2
-
通过把0作为数值范围的中间值,从而不使用符号位的情况下来表示负数的表示方法称为什么?
excess系统表现
-
10101100.01010011这个二进制,用16进制表示的话是多少
AC.53
小数部分,跟整数一样,按权展开(纸面上)
在计算机内部,一般采取双精度浮点数/单精度浮点数
浮点数一般用符号、尾数、基数和指数四个部分表示小数
符号部分:用一个数据位来表示数值的符号。1表示负,0表示正数
尾数部分:将小数点前面的值固定为1的正则表达式
指数部分:采取有EXCESS系统表现,通过将指数部分表示范围的中间值设为0,使得负数不需要用符号来表示
实例:0.75
如何避免计算机计算出错
原因:采用浮点数来表示小数,也有因为位溢出造成的计算错误
解决措施:
-
回避问题,无视错误,计算只需要近似值即可
-
小数转换成整数来计算
-
采用BCD方法
第四章 熟练使用有棱有角的内存
问题:
-
有十个地址信号引脚的内存IC(集成电路)可以指定的地址范围是多少?
用二进制数表示的话是0000000000~1111111111(0-1023)
-
高级编程语言中的数据类型表示的是什么?
占据内存区域的大小和存储在该内存区域的数据类型
-
在32位内存地址的环境中,指针变量的长度是多少位?
32位
-
与物理内存有着相同构造的数组的数据类型长度是多少?
1字节
-
用LIFO方式进行数据读写的数据结构称为什么?
栈
-
根据数据的大小链表分叉成两个方向的数据结构称为什么?
二叉查找树
内存IC组成:电源、地址信号、数据信号、控制信号等用于输入输出的大量引脚(IC的引脚),通常为其指定地址,来进行数据的读写
内存的存储量计算:根据地址引脚的数量决定,例如有A0~A10共11个,则内存可以存储2的11次方字节 2048K 2KB
内存运行机制:将VCC引脚接入+5V,GND接入0V的电源,并使用A0~A9的地址信号来指定数据的存储场所。然后再将数据的值输入给D0~D7的数据信号,并把WR信号设定为1。读出数据时,通过A0~A10的地址信号指定数据的存储场所,然后将RD(READ读出)信号设为1;指定数据就会输出到D0~D7的数据信号引脚了
内存的逻辑模型如同一层层的房子,每一层存放着相对应的数据,可以通过申明不同数据类型的变量占用不同的内存大小
char a; short b; long c; a = 123; b = 123; c = 123;
数组是指多个相同数据类型的数据在内存中连续排列的形式
各类数据结构
-
栈 LIFO
-
队列 FIFO 一般采取环形缓冲区实现,高效利用空间
-
链表 容易添加和删除
-
二叉树 高效查找
第五章 内存和磁盘的亲密关系
问题:
-
存储程序方式指的是什么?
在存储装置中保存程序,并逐一运行的方式
-
通过使用内存来提高磁盘访问速度的机制称为什么?
Disk Cache 磁盘缓存
-
把磁盘的一部分作为假想内存来使用的机制称为什么?
虚拟内存
-
Windows中,程序运行时,存储着可以动态加载调用的函数和数据的文件称为什么?
DLL文件
-
在EXE程序文件中,静态加载函数的方式称为什么?
静态链接
-
在Windows计算机中,一般磁盘的1个扇区是多少字节
512字节
程序必须加载到内存才能运行,在硬盘中的原始程序是无法直接运行的
-
磁盘缓存:把从磁盘中读取的数据存储到内存中去(实际是内存)
在web端也有类似的应用,将大型的图片暂时保存在磁盘中,下次读取时候直接转入。
-
虚拟内存:把磁盘的一部分作为假想的内存(实际上是磁盘)
还可以分为分页式、分段式
节省内存的编程方法
-
DLL文件实现函数共有
DLL相当于一个公共的库,在运行exe的时候,都会调用DLL里的函数
优点:节省内存,也会节省软件升级所需要的大小
-
通过_stdcall来减少程序文件的大小
会使用栈清理方法:把不需要的数据从接收和传递函数的参数时使用的内存上的栈区域中清除出去,在C语言中,在函数前缀加上_stdcall
磁盘的物理结构
第六章 亲自尝试压缩数据
问题:
-
文件存储的基本单位是什么?
一个字节
-
DOC、LZH和TXT这些扩展名中,哪一个是压缩文件的扩展名?
LZH
-
文件内容用“数据的值*循环的次数” 来表示的压缩方法是RLE算法还是哈夫曼算法?
RLE算法
-
在Windows计算机经常使用的SHIFT JIS字符编码中,1个半角英数是用几个字节的数据来表示的?
1个字节
-
BMP格式的图像文件,是压缩过的吗?
没有压缩
-
可逆压缩和非可逆压缩的不同点是什么?
压缩后的数据能复原就是可逆压缩,无法复原就是非可逆压缩
-
文件是字节数据的集合,用1字节(=8位)表示的字节数据有256种,用二进制表示,范围就是00000000-11111111
-
如果文件中存储的的数据是文字,文件就是文本,若果是图形,文件就是图像文件
-
任何情况下,文件中的字节数据都是连续存储的
RLF算法(行程长度编码):采用数据*重复次数的方式来记录
AAABBBCC A3B3C1
适用于相同数据连续出现的图像,不适合文本内容压缩
哈夫曼算法
-
很有效的压缩方法
-
出现频率高的用少的位数编码来表示
除了BMP格式是可逆压缩,JPEG、TIFF、GIF都是非可逆压缩。TIFF会带有各种标签信息
第七章 程序是在何种环境中运行的
问题:
-
应用的运行环境,指的是什么?
操作系统和计算机本身(硬件)的种类
-
MacOS操作系统,能在AT兼容机上运行吗?
无法运行
-
Windows上的应用,能在MacOS上运行吗?
无法运行
-
FreeBSD提供的Ports,指的是什么?
通过使用源代码来提供应用,并根据运行环境进行整合编译,从而得以在该环境下运行的机制
-
在MacOS利用Windows环境模拟器称为什么?
Virtual PC for Mac
-
Java虚拟机的功能是什么?
运行Java应用的字节代码
运行环境 = 操作系统 + 硬件
在Windows系统下面,应用软件、键盘输入、显示器输出等并不是直接向硬件发送指令,而是通过向Windows发送指令来间接实现的
不同的操作系统的API不同,应用程序向操作系统传递指令的途径也是不同的
API:应用程序向操作系统传递指令的途径
不依赖特定的硬件及操作系统的程序运行
-
利用虚拟机获得其他操作系统环境
-
提供相同运行环境的Java虚拟机
Java代码----字节代码----本地代码
java也是将java语法记述的源代码编译后运行,不过编译后生成的并不是特定CPU使用的本地代码,而是名为字节代码的程序,Java虚拟机是一边把java字节代码逐一转为本地代码运行的
缺点:
-
不同的java虚拟机之间无法进行完整的互换,这是以为,想让所有字节代码在任意java虚拟机上都能运行是十分困难的,并且,当我们用只适用于某些特定硬件的功能时,就会出现在其他java虚拟机上无法运行,或者功能使用受限等情况
-
运行速度的问题,java虚拟机每次都要把字节代码转换为本地代码,,这一机制是造成运行速度慢的原因
-
BIOS:存储在ROM中,是预先内置在计算机主机内部的程序,BIOS除了键盘、磁盘、显卡等基本控制之外,还有启动“引导程序”的功能
-
引导程序:存储在启动驱动器起始区域的小程序。操作系统的启动驱动器一般是硬盘,不过有时也可以是CD-ROM或软盘
第八章 从源文件到可执行文件
问题
-
CPU可以解析和运行的程序形式称为什么代码?
本地代码(机器语言代码)
-
将多个目标文件结合生成EXE文件的工具称为什么?
链接器
-
扩展名位.obj的目标文件的内容跟,是源代码还是本地代码?
本地代码
-
把多个目标文件收录在一起的文件称为什么?
库文件
-
仅包含Windows的DLl文件中存储的函数信息的文件称为什么?
导入库
-
在程序运行时,用来动态申请分配的数据和对象的内存区域形式称为什么?
堆
-
编译器和解释器有什么不同?
编译器是在运行前对所有源代码进行解释处理的。而解释器则是在运行时对源代码的内容一行一行地进行解释处理
-
分割编译指的是什么?
将整个程序分为多个源代码来编写,然后分别进行编译,最后链接成一个EXE文件。这样每个源代码相对变短,便于程序管理
-
Bulid指的是什么?
根据开发工具种类的不同,有的编译器可以通过选择”Bulid“菜单来生成EXE文件。这种情况下,Bulid指的是连续执行编译和链接
-
使用DLL文件的好处是什么?
DLL文件中的函数可以被多个程序共用。因此,借助此功能可以节约内存和磁盘。此外,在对函数的内容进行修正时,还不需要重新链接使用这个函数的程序
-
不链接导入库的话,就无法使用调用DLL文件中的函数吗?
通过使用LoadLibrary()及GetProcAddress等API,即使不连接导入库,也可以在程序运行时调用DLL文件的函数,不过使用导入库简单一些
-
源代码(源程序):用某种编程语言编写的程序
-
源文件:保存源代码的文件
-
编译器:将高级语言编写的源代码转换成本地代码
-
链接:把多个目标文件结合,生成一个EXE文件的处理
-
链接器:运行链接的程序就是
-
库文件:把多个目标文件集成到一个文件中的形式,链接器指定库文件之后,就会从中把需要的目标文件抽取出来,并同其他目标文件结合生成EXE文件
-
外部符号:指其他目标文件中的变量或函数
-
标准函数:不是通过源代码形式而是通过库文件形式和编译器一起提供的
-
静态链接库:存储着目标文件的实体,并直接和EXE文件结合的库文件形式称为静态链接库
-
导入库:存储着两个信息,一个是函数存在某个DLL文件中,另一个是存储这DLL文件的文件夹信息的库文件
总体流程
EXE文件中会给变量及函数分配虚拟的内存地址。程序运行时,虚拟的内存地址会转换成实际的内存地址。链接器会在EXE文件的开头,追加转换内存地址所需的必要信息
程序加载时会生成堆、栈。
栈:存储函数内部临时使用的变量
堆:用来存储程序运行时的任意数据及对象的内存领域
第九章 操作系统和应用的关系
问题
-
监控程序的主要功能是什么?
程序的加载和运行
-
在操作系统上运行的程序称为什么?
应用或应用程序
-
调用操作系统功能称为什么?
系统调用
-
GUI是什么的缩写
Graphical User Interface 图形用户界面
操作系统的原型,开发出了仅仅具有加载和运行功能的监控程序,后期不断增加功能,最终形成了操作系统
Windows操作系统的特征
-
通过API函数集来提供系统调用(API:联系作成应用的程序员和操作系统之间的接口)
-
提供采用了图形用户界面的用户界面
-
通过WYSIWYG实现打印输出(WYSIWYG是指显示器上显示的内容可以直接通过打印机打印输出)
-
提供多任务功能(通过时钟分割技术来实现的)
-
提供网络功能和数据库功能
-
通过即插即用实现设备驱动的自动设定
第十章 通过汇编语言了解程序的实际构成
问题:
-
本地代码的指令中,表示其功能的英文缩写称为什么?
助记符
-
汇编语言的源代码转换成本地代码的方式称为什么?
汇编
-
本地代码转换成汇编语言的源代码的方式称为什么?
反汇编
-
汇编语言的源文件的扩展名,通常是什么格式?
.asm
-
汇编语言程序中的段定义指的是什么?
构成程序的命令和数据的集合组
-
汇编语言的跳转指令,是在何种情况下使用的
将程序流程跳转到其他地址时需要用到的指令
汇编语言的源代码,是由转换成本地代码的指令和针对汇编器的伪指令构成
伪指令:负责把程序的构造以及汇编的方法指示给汇编器
段定义:由伪指令segment 和ends围起来的部分,是给构成程序的命令和数据的集合题而得到------命令和数据等程序的集合体
汇编语言指令的语法结构是操作码+操作数(也存在只有操作码没有操作数的指令)。
指令中最常使用的是对寄存器和内存进行数据存储的mov指令。mov指令的两个操作数,分别用来指定数据的存储地和读出源。push指令和pop指令中只有一个操作数。该操作数表示的是“push的是什么及pop的是什么”。
在汇编语言中,函数名表示的是函数所在的内存地址。
最优化功能是编译器在本地代码上费尽功夫实现的,其目的是让编译后的程序运行速度更快、文件更小。
在函数内部利用的寄存器,要尽量返回到函数调用前的状态。为此,我们就需要将其暂时保存在栈中,然后再在函数处理完毕之前出栈,使其返回到原来的状态。
函数的参数是通过栈来传递,返回值是通过寄存器来返回的
局部变量是临时保存在寄存器和栈中的。寄存器空闲时就使用寄存器,寄存器空间不足的话就使用栈。
在汇编语言的源代码中,循环是通过比较指令(cmp)和跳转指令(jl)来实现的。比较结果小或相等时跳转的jle(jump on less or equal)、大或相等时跳转的jge(jump on greater orequal)、不管结果怎样都无条件跳转的jmp。
对了解计算机和程序的实际运行方式来说,体验汇编语言是最有效的。
第十一章 硬件控制方法
问题:
-
汇编语言中,是用什么指令来同外围设备进行输入输出操作?
IN指令和OUT指令
-
I/O是什么的缩写?
Input/Output
-
用来识别外围设别的编号称为什么?
I/O地址或I/O端口号
-
IRQ是什么的缩写?
Interrupt Request
-
DMA是什么的缩写?
Direct Memory Access
-
用来识别具有DMA功能的外围设备的编号称为什么?
DMA通道
Windows控制硬件时借助的输入输出指令,代表性的时IN和OUT指令
-
IN指令通过指定端口号的端口输入数据,并将其存储在CPU内部的寄存器
-
OUT指令则把CPU寄存器存储的数据,输出到指定端口号的端口
-
I/O控制器:计算机主机中,附带了用来连接显示器及键盘等外围设备的连接器,各连接器的内部,都连接有用来交换计算机主机同外围设备之间电流特性的IC,这些IC,统称为I/O控制器
-
端口:I/O控制器中有用于临时保存输入输出数据的内存,I/O控制器内部的内存,也称寄存器,与CPU内部的寄存器不同。CPU内部的寄存器是用来进行数据运算处理的,而I/O控制器则主要是用来临时存储数据的
-
中断请求IRQ:暂停当前正在运行的程序,并跳转到其他程序运行的必要机制
-
实施中断请求的是连接外围设备的I/O控制器,负责实施中断处理程序的是CPU,为了进行区分,外围设备的中断请求会使用不同与I/O端口的其他编号,该编号称为中断编号。
-
操作系统和BIOS会提供响应中断编号的中断处理程序
-
DMA:不通过CPU的情况下,外围设备直接和主内存进行数据传送。
-
I/O端口号、IRQ、DMA通道是识别外围设备的3点组合,不过IRQ、DMA不是每个外围设备都必须具备的
在现代计算机中,显卡等专用硬件一般都配置与主内存相独立的VRAM和GPU(图形处理器)
第十二章 让计算机”思考“
问题:
-
用计算机进行的模拟实验称为什么?
计算机模拟
-
伪随机数指的是什么?
伪随机数同真正的随机数不同
-
随机数的种子是什么?
随机数的种子不同,产生的随机数也是不同
-
计算机有思考功能吗?
作为计算机大脑的CPU,其本身不具有思考功能
-
计算机有记忆功能吗?
内盘和磁盘等有记忆功能
-
AI是什么的缩写?
Artificial Intelligence