Skip to content

强化

第一章

1. 翻译程序、解释程序、汇编程序、编译程序的区别和联系是什么?

翻译程序有两种:一种是编译程序,它将高级语言源程序一次全部翻译成目标程序,只要源程序不变,就无须重新翻译。 另一种是解释程序,它将源程序的 一条语句翻译成对应的机器目标代码,并立即执行,然后翻译下一条源程序语句并执行,直至所有源程序语句全部被翻译并执行 完。所以解释程序的执行过程是翻译一句执行一句,并且不会生成目标程序。

汇编程序也是 一种语言翻译程序,它把汇编语言源程序翻译为机器语言程序。

编译程序与汇编程序的区别:若源语言是诸如C、C++、Java等“高级语言”,而目标语言是 诸如汇编语言或机器语言之类的 “ 低级语言”,则这样的一 个翻译程序称为编译程序。若源语言 是汇 编语言,而目标语言是机器语言,则这样的一 个翻译程序称为汇编程序。

2. 字长、机器字长、指令字长、存储字长的区别和联系

字长是指CPU内部用于整数运算的数据通路的宽度,因此字长等于CPU内部用于整数运算的运算器位数和通用寄存器宽度。

指令字长:一个指令字中包含的二进制代码的位数(半字长指令、双字长指令)

存储字长:一个存储单元存储的二进制代码的位数

3. 性能指标

时钟周期:CPU工作的最小时间单元

主频 = 1/时钟周期

CPI:一条指令所需要的时钟周期数

IPS:每秒执行多少条指令 IPS = 主频 / 平均CPI

MIPS:每秒执行多少百万条指令 = 主频/ (CPI x 10^6)

MIPS 百万 10^6 GIPS 十亿 10^9 TIPS 万亿 10^12 PIPS 千万亿 10^15 亿亿10^16

执行时间 = 指令条数 x CPI / 主频

  1. 程序员可见寄存器和不可见寄存器

可见寄存器:通用寄存器组、程序状态字寄存器PSW、程序计数器PC、累加寄存器ACC、栈指针SP

不可见:指令寄存器IR、暂存寄存器DR、MAR、MDR

第二章

  1. 二进制、八进制和十六进制相互转换

常见的二进制和十进制数:

  • (2^{10} = 1024) ⚠️
  • (2^{11} = 2048)
  • (2^{12} = 4096)
  • (2^{13} = 8192)
  • (2^{14} = 16,384)
  • (2^{15} = 32,768)
  • (2^{16} = 65,536) ⚠️
  • (2^{17} = 131,072)
  • (2^{18} = 262,144)
  • (2^{19} = 524,288)
  • (2^{20} = 1,048,576)

注意带小数的计算:整数部分除基取余法,小数部分乘基取整法上左下右

  1. 原码、补码、反码、移码

表示范围(对称性)、0表示(是否唯一)、相互转换

原码表示范围:-(2^n -1) ~ (2^n -1),关于原点对称

0表示有+0和-0之分,不唯一,一般用来表示真值

补码表示范围:-(2^n) ~ (2^n - 1),不对称,比原码多一个-2^n

0表示唯一

反码表示范围:了解 各位取反

移码:真值+ 偏置值,0表示唯一

原码转补码:正数相同,负数原码按位取反末位+1,或者从右往左数第一个1,后续的1都改为0

  1. 无符号整数和有符号整数的转换

采用补码表示

char、short、int、long的位数

char默认是无符号数,其他默认带符号数,相互类型转换

大转小(截断),小转大(补位-> 零拓展和符号拓展)

无符号数转换为带符号数:

如果无符号数的最高位是 0,高位会被补零,保持为正数。

如果无符号数的最高位是 1,高位会被补一,变为负数。

无符号数转无符号数:高位会被补零,确保数值的大小不变,只是增加了表示该数值所需的位数。

总结:转为带符号数 补符号位,转为无符号数 补零

  1. 运算器部件和加法器的组成

ALU、移位器、状态寄存器(PSW)、通用寄存器

  1. 逻辑移位和算术移位

各自的移位规则?

带符号数和无符号数分别采用哪种移位?

移位操作的溢出判断和精度丢失问题

  1. 加减运算

注意题目中给的是真值还是机器数(可能为补码)

减法变加法

  1. 溢出判断

溢出的前提:符号相同相加、符号相异相减、

溢出判断的3种方法:一位符号位、双符号位、

  1. OF、SF、ZF、CF所表示的含义

OF:溢出标志,对无符号数无意义,用于有符号数的溢出判断 OF = Cn 异或 Cn-1 符号位进位和最高数位进位异或

CF:进位标志,对有符号数无意义,用于无符号数的溢出判断 CF = Sub 异或 Cout

ZF:零标志位,均适用。

SF:符号位,对无符号数无意义

  1. 无符号数和有符号数加减运算后CF和OF的值

  2. 乘除法运算 error❌

乘法实现原理

乘法指令溢出判断

  1. 浮点数的表示格式

符号 + 尾数 + 基数^阶数

上溢和下溢判断

  1. 浮点数的规格化

左归:尾数左移,阶码-1

右归:尾数右移,阶码+1

13. IEEE754标准

单精度浮点数格式(32位):1一位符号位,8位阶码,23位尾数(最高位隐含1所以拓展到24位)

双精度浮点数格式(64位):一位符号位,11位阶码,52位尾数

阶码使用移码e表示(真值+偏置值127) 1~254,真值范围-126 ~ 127

单精度最小值和最大值(2012 14)

最小值 1.0 x 2^-126

最大正整数 1.111111... x 2^127 = (2-2^-23) x 2^127 = 2^128 - 2^104 (2012)

阶码全0全1的含义(正零、负零、正无穷、负无穷)

0.23个11如何表示? 2-2^-23

非规格化数的满足条件:阶码全0 尾数不为0

非规格化正数和负数:尾数 x 2^-126

  1. 浮点数的加减运算

对阶 (小阶向大阶看齐)阶码相等

尾数加减(注意隐含位)

尾数规格化(左归右归)

尾数舍入(丢失精度)不影响结果是否溢出

溢出判断

  1. 类型转换后数值变化

int转float:float所表示的范围比int大得多,所以float能表示int,但float23位尾数不能表示int32位尾数,存在精度丢失。

int转double或 float转double:double所表示的范围以及尾数精度都要比int和float所表示的大,故能完全表示

double转float:float所表示的范围更小,故可能发生溢出和精度丢失

float或者double转int:大范围转小范围存在溢出截断和精度丢失

  1. 数据的大端小端存储

大端方式:先高字节,再低字节 (人类熟悉的方式 11111111 11110000 )

小端方式:先低字节,再高字节 (00001111 11111111)

  1. 对齐方式

边界对齐:

边界不对齐:

第三章

  1. 随机存储器RAM、只读ROM

存取方式、读写方式、断电后信息是否可保存(易失性)

  1. SRAM和DRAM的原理

六晶体MOS管,栅极电容(定期充电也就是刷新)

DRAM需要读后再生和定期刷新,集中刷新、分散刷新、异步刷新,行列地址分两次送,

  1. DSRAM容量计算

地址线复用技术:行地址和列地址通过相同的引脚分先后两次输入,地址引脚线可减少一半

按行刷新,故行列尽可能相同,行数 <= 列数

  1. 存储体、存储阵列,多模块存储器的关系是什么

层次关系:存储体是一个总的概念,而存储阵列和多模块存储器是存储体的具体实现形式。存储阵列可以包含多个存储体(如多个硬盘),而多模块存储器则是通过将多个内存模块组合在一起来提高性能。

协同作用:在实际应用中,多模块存储器可以作为存储体的一部分,通过存储阵列的方式来优化性能和可靠性。比如,一个服务器可能使用多模块的内存与硬盘阵列相结合,以满足高性能和数据安全的需求。

  1. 多模块存储器

高位交叉编址:地址的高位部分决定了数据存储在哪个模块

低位交叉编址:地址的低位部分决定了数据存储在哪个模块

每隔1/m个存储周期启动各模块,

访存冲突分析,对同一个模块的访问出现在一个周期内,则会出现冲突

  1. CPU和主存的链接

地址线、数据线、片选控制线或线选控制线

  1. 主存容量的扩充

4M x 8位

字扩展(高),位拓展(宽),字位同时拓展

故需要增加额外的线:选择存储芯片,进行片选

线选法:每个片一个线来控制是否选中 为0选中 其余为1 4片则需要4根线

译码片选法:2^n 个信号 (n为高位 用于产生片选信号)

地址范围、容量的计算以及对应关系

地址范围计算 0000 0000 ~ 0003 FFFF的地址范围大小

确定某地址 在哪块芯片

设按字节编址,2Kx4位 组成8kx8位 确定0B1FH的芯片最小地址

题目并未给出地址范围 但组成8Kx8位 按字节编址 每两块并联组成2Kx8位 可以确定寻址的范围 2^13

13位地址 2位确定哪一组芯片 1一位确定哪一块芯片 剩余10位为芯片内地址

第一组:0000 0000 0000 0000 ~ 0000 0111 1111 1111 = 0000H~07FFH

第二组:0000 1000 0000 0000 ~ 0000 1111 1111 1111 = 0800H ~ 0FFFH

第三组:0001 0000 0000 0000 ~ 0001 0111 1111 1111 = 1000H ~ 17FFH

第四组:0001 1000 0000 0000 ~ 0001 1111 1111 1111 = 1800H ~ 1FFFH

0B1F = 0000 1011 0001 1111 0000 1 位于第2组 最小地址为0800H

错误解法:未确定地址位数,直接将高地址2位默认为组号

  1. 磁盘存储器的组成和性能指标

驱动器 控制器 磁道 盘面 扇区

道密度、位密度、面密度

  1. 存取时间的计算

过程:先移动磁头道指定磁道上,确定盘面,最后旋转到指定扇区,最后读取数据

地质结构:柱面号(磁道号)+ 盘面号 + 扇区号

t = 寻道时间 + 旋转时间 + 传输时间

转速和时间t的关系?

数据传输速率 = R(转速)* N(磁道的容量)

  1. 高速缓存cache

局部性原理:时间局部性和空间局部性(学会分析)

时间局部性:某个单元经常被访问

空间局部性:访问某个单元时,其相邻的其他单元也即将被访问

数据查找:

宏观:cache->内存->磁盘

微观:有物理地址根据cache映射关系解析地址,根据映射关系找到对应行或组,对比标记位找到指定单位,查看有效位,根据块内地址取出对应单元,若根据映射关系对比标记位时不匹配,则cache缺失,利用替换策略换入。

直接映射 标记 行号 块内地址

全相联:标记 块内

组相联:标记 组号 块内

地址映射:物理地址结构(先确定cache的映射关系)

替换策略:cache行已满,此时访问新的内存块,需要换入并将选中一个cache行换出

先进先出FIFO:本质上就是队列

最近最少使用LRU:确定cache行数 访问时从后往前看

最不常使用LFU

写入策略:执行一个写操作时,该单元已在cahhe中,写cache,还是同时写cahche和内存,如果写操作的对应单元不在caache中时,写对应的主存单元,针对是否将该单元掉入cache分为写分配和非写分配,写分配根据局部性原理会将该主存单元掉入cache中,非写分配不会掉入cache。

全写:同时写cache和内存

回写:只写cache

cache的基本工作原理和流程:利用局部性原理,将常访问的内存部分副本放在离CPU近的地方,以解决CPU和内存速度不匹配的问题,基本流程就是数据查找的过程,如上分析。

cache中存储的仅是内存中较活跃的副本

cache命中率的计算:命中的次数 / 访问总次数(注意区分读写次数)

CPU平均访存时间的计算:访存时间即为cache缺失转而访问内存所花费的时间,cache缺失率 x 访问总次数 x 单次访存时间

  1. cache和主存的映射方式

直接相联(放入指定行): 标记 行号 块内地址

全相联(随意放):标记 块内

组相联(先分组 组内随意放):标记 组号 块内

访问过程

比较器的个数:直接相联仅需要一个比较器、全相联每行都需要一个比较器,组相连行间仅设置一个比较器,组内根据组数设置对应组数个比较器。

计算cache地址结构的位数和总容量

cache行所存储的内容:有效位、标记位、替换位、脏位、数据

  1. cache中主存块的替换算法

直接映射无需替换算法

常见的替换算法:算机算法(RAND)、FIFO(先进先出)、LRU(最近最少使用)、LFU(最不常用)

LRU替换位位数的计算:全相联(log2行数)、 组相连(log2组内数)

  1. 一致性问题(回写位)

cache写操作命中:全写法和回写法

cache写操作不命中:写分配法和非写分配法

  1. 虚拟存储器

虚拟地址和物理地址的转换

编译阶段:编译器将源代码转换为目标代码,生成相对地址(从0开始),但这些地址并不是真正的虚拟地址

链接阶段:链接器将多个目标文件合并,并处理外部引用。此时,仍然使用的是逻辑地址,而不是虚拟地址

装入阶段:在这一阶段,操作系统将程序加载到内存中,并为其分配虚拟地址空间。虚拟地址在此阶段被分配,并建立虚拟地址到物理地址的映射

虚拟地址是在装入阶段产生的

  1. 页表虚拟存储器

虚拟地址

普通:页号 页内地址

带页目录:页目录号 页号 页内地址

地址位数的计算:确定虚拟地址的位数,页的大小,是否带页目录

虚拟地址:页目录号 页号 页内偏移

物理地址:页框号 + 页内偏移

页目录项的组成 :(隐藏页号)、有效位、修改位、替换位、存取权限位、页框号

页号是固定的 里面存放的页框号不固定 如存在页面替换算法 将某个页号的内容替换为其他页框号

带TLB的查找过程:根据

TLB的地址组成(TLB采用组相连或者全相连映射):标记 组号 页内地址 / 标记 页内地址

TLB中的内容仅仅是页表的副本

cache和TLB中存放的都是page的副本

cache、TLB和page缺失组合分析:只要page未命中、其余均未命中

大题考数组的分页存储和缺页分析:int A[1024][1024] 确定数组A的起始地址,页的大小(4K),确定多少个数据占一页(4Bx1024 = 4K 1024个数据占一页),数组A占两页,再分析TLB的大小和cache的大小,计算哪几块会被调入从而避免访存。

  1. 段式虚拟存储器

按程序逻辑分段

地址结构: 段号 段内地址

根据段表基址寄存器 + 段号 找到对应的段表项

段表项的内容: 段首地址 装入位 段长

段首地址 + 段内地址 = 物理地址

存在两个越界判断:1、找对应的段表项 2、根据段长判断段内地址是否超出该段

  1. 段页式虚拟存储器

先把程序逻辑分段 再把段分固定大小的页

虚拟地址 = 段号 页号 页内地址偏移

寻址过程:

根据段表基址寄存器 + 段号 找到对应的段表项(并判断是否越界)

取出该段表项中的页表地址 + 页号 = 页框号

页框号 + 页内偏移 = 物理地址

  1. CISC和RISC

CISC复杂指令集,长度不等,采用微程序控制器,通用寄存器少

RISC精简指令集,长度固定,采用硬布线控制。通用寄存器多

CISC和RISC的对比

第四章

CPU如何区分指令和数据的?:CPU在指令执行的不同阶段区分,例如取指、间址、

  1. 指令地址的格式&根据指令格式生成对应的机器码

对应的机器码涉及到地址范围的采用补码形式!!!

地址位数和寻址范围:

| 操作码 | 地址 |

操作码用来标识进行何种操作 地址字段给出进行该操作所需要的数据等信息

  1. 指令字长

单字长 半字长 双字长指令(针对于机器字长)

  1. 指令格式

零地址:空操作、中断隐指令

一地址、二地址、三地址、四地址

根据各地址格式分析访存次数:访存次数需要确定寻址方式

  1. 拓展指令格式和定长操作码

定长操作码表明了系统可表示最大多少条指令2^n(n为高位)

采用可变操作码进行拓展指令格式

主要思想和计算机网络的子网划分一致,任何短码不不是长码的前缀

例如某指令系统需要15条三地址、15条2地址、15条1地址、16条0地址

从三地址开始设置操作码 因为三地址的操作码最短,15条需要

三地址:0000~1110

二地址:1111 0000 ~ 1111 1110

一地址:1111 1111 0000 ~ 1111 1111 1110

0地址: 1111 1111 1111 0000 ~ 1111 1111 1111 1111

零地址、一地址...对应子网号

  1. 操作码类型

数据传送、算术和逻辑运算、移位取反、转移等

区分跳转指令、调用指令、返回指令、条件转移指令的区别

详情看:指令

  1. 指令的寻址方式(区分指令寻址和数据寻址)

指令寻址:确定下一条待执行指令的地址

数据寻址:确定本条指令所需数据地址(解析地址码字段含义即数据寻址)

指令寻址 = 指令寻址 + 数据寻址

CPU执行一条指令都是根据PC中的内容取出该条指令的地址 从而进入取指阶段

  1. 指令寻址(PC自增大小和编址方式、指令字长的关系)

顺序寻址: PC+1(此处的1应为一条指令的长度 所以得确定编址方式 例如按字节编址 指令字长16 则pc+2)

跳跃寻址:使用转移指令实现,分为绝对转移(直接给出地址),相对转移(PC+偏移),目的都是修改pc的值,下一条指令的地址仍然由pc给出

  1. 数据寻址

寻址特征的作用(区分操作码)

计算操作数的地址,使用寻址特征字段来表示属于那种寻址方式。

| 操作码 | 寻址特征 | 形式地址 |

隐含寻址:隐含操作数的地址 ADD 寻址特征 操作数(A)另一个操作数在ACC中

立即数寻址:A即为操作数本身 op 寻址特征 操作数本身A

直接寻址:A的操作的内存地址 需要访存1次 (A)

间接寻址:A给的操作数地址的地址 需要访存2次 ((A))

寄存器寻址:A给出的是寄存器的编号 寄存器内的内容即为操作数 访问寄存器不需要访存 reg(A)

寄存器间接寻址:A给出的是寄存器的编号 寄存器内的内容为操作数的地址 访问寄存器不需要访存 需要访存1次 mem(reg(A))

‼️ 相对寻址:pc + 相对偏移量(补码给出)(计算偏移量和目标地址) pc + “1” + A 广泛用于转移指令,有利于程序浮动

基址寻址:基址寄存器BR的内容 + A (基址寄存器的内容不变 由os指定 A可变 一般用于多道程序设计)

为什么可用于多道程序?因为程序一般会经过编译、链接、装入,链接过程中形成的逻辑地址,装入到内存中时,需要记录起始物理地址,一般用用一个通用寄存器作为基址寄存器存放该物理地址,进程的PCB中也可记录该寄存器,在多道程序并发中,可改变基址寄存器的值实现并发。

变址寻址:变址寄存器IX的内容 + A (变址寄存器的内容可变 由用户指定 A不变 一般用于循环和数组)

在数组访问中,变址寄存器设为数组的偏移量,形式地址为数组的首地址

相对、基址、变址称为偏移寻址

堆栈寻址:硬堆栈(寄存器)和软堆栈(内存)堆栈指针SP

  1. 汇编指令

常见的寄存器表示 E开头 EAX EBX

汇编指令的格式 AT&T和Intel格式 (只需要掌握Intel)

不区分大小写

第一个为源操作数、第二个为目的操作数 从左到右

表示寄存器和立即数不需要加前缀

内存寻址[x] [edx + eax*2 + 8]

指定数据长度b、w、l、(byte ptr word ptr dword ptr)

mov

push 将操作数压入内存的栈,ESP代表栈顶,入栈前,ESP先减“4”(栈的增长方向和内存地址增长方向相反)

pop指令 出栈 ESP +

add/sub指令

shl/shr 逻辑移位

jump 转移指令 IP(指定位置)

jcondition 条件转移指令

cmp/test指令

call/ret

选择语句的机器级表示 jump 跳转指令 cmp指令

循环语句的机器级表示 cmp jd

过程调用的机器级表示:(王道视频课二刷)

准备阶段 上一个栈的esp指针放入ebp中 完成清栈 指向栈底 方便获取入口参数

过程体

结束阶段

第五章

  1. 微程序的控制方式
  • 直接编码方式:每一位代表一个控制信息
  • 字段直接编码方式:各个互斥类采用2^n编码方式
  • 字段间接编码方式:通过微指令中的字段来决定下一条微指令的地址,从而实现灵活多变的控制流程
  1. 指令执行过程

ADD (R1), R0 功能为将 (R0) + ((R1)) 结果存入 (R1) 功能描述:将寄存器R0中的内容与寄存器R1中的内容所指主存单元相加,并将结果存入寄存器R1所指的主存单元中 | 时钟 | 功能 | 有效控制信号 | | C1 | MAR <- (PC)| PCout,MARin | | C2 | MDR <- M(MAR), PC <- (PC) + 1| MDRin,MemR,PC+1 | | C3 | IR<-(MDR)| MDRout,IRin | | C4 | 指令译码| | | C5 | MAR <- (R1) | R1out,MARin | | C6 | MDR <- M(MAR)| MARout,MDRin.MemR | | C7 | A <- (MDR) | MDRout,Ain | | C8 | ALU <- (A) + (R0) | Aout,R0out,ALUin | | C9 | AC <- ALU | ALUout,ACin | | C10 | MDR <- (AC)| ACout,MARin | | C11 | M(MAR) <- (MDR) | MDRout,MemW |

第六章

第七章

  1. IO控制方式计算

CPU用于该IO控制方式的IO时间占整个CPU时间的百分比是多少?

程序轮训方式:

中断方式:每秒钟产生多少次中断 * 处理中断所需时钟周期数 / 主频

DMA方式:每秒钟产生多少次DMA请求 * 处理DMA所需时钟周期数 / 主频

如有转载或 CV 的请标注本站原文地址