强化
第一章
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 / 主频
- 程序员可见寄存器和不可见寄存器
可见寄存器:通用寄存器组、程序状态字寄存器PSW、程序计数器PC、累加寄存器ACC、栈指针SP
不可见:指令寄存器IR、暂存寄存器DR、MAR、MDR
第二章
- 二进制、八进制和十六进制相互转换
常见的二进制和十进制数:
- (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)
注意带小数的计算:整数部分除基取余法,小数部分乘基取整法上左下右
- 原码、补码、反码、移码
表示范围(对称性)、0表示(是否唯一)、相互转换
原码表示范围:-(2^n -1) ~ (2^n -1),关于原点对称
0表示有+0和-0之分,不唯一,一般用来表示真值
补码表示范围:-(2^n) ~ (2^n - 1),不对称,比原码多一个-2^n
0表示唯一
反码表示范围:了解 各位取反
移码:真值+ 偏置值,0表示唯一
原码转补码:正数相同,负数原码按位取反末位+1,或者从右往左数第一个1,后续的1都改为0
- 无符号整数和有符号整数的转换
采用补码表示
char、short、int、long的位数
char默认是无符号数,其他默认带符号数,相互类型转换
大转小(截断),小转大(补位-> 零拓展和符号拓展)
无符号数转换为带符号数:
如果无符号数的最高位是 0,高位会被补零,保持为正数。
如果无符号数的最高位是 1,高位会被补一,变为负数。
无符号数转无符号数:高位会被补零,确保数值的大小不变,只是增加了表示该数值所需的位数。
总结:转为带符号数 补符号位,转为无符号数 补零
- 运算器部件和加法器的组成
ALU、移位器、状态寄存器(PSW)、通用寄存器
- 逻辑移位和算术移位
各自的移位规则?
带符号数和无符号数分别采用哪种移位?
移位操作的溢出判断和精度丢失问题
- 加减运算
注意题目中给的是真值还是机器数(可能为补码)
减法变加法
- 溢出判断
溢出的前提:符号相同相加、符号相异相减、
溢出判断的3种方法:一位符号位、双符号位、
- OF、SF、ZF、CF所表示的含义
OF:溢出标志,对无符号数无意义,用于有符号数的溢出判断 OF = Cn 异或 Cn-1 符号位进位和最高数位进位异或
CF:进位标志,对有符号数无意义,用于无符号数的溢出判断 CF = Sub 异或 Cout
ZF:零标志位,均适用。
SF:符号位,对无符号数无意义
无符号数和有符号数加减运算后CF和OF的值
乘除法运算 error❌
乘法实现原理
乘法指令溢出判断
- 浮点数的表示格式
符号 + 尾数 + 基数^阶数
上溢和下溢判断
- 浮点数的规格化
左归:尾数左移,阶码-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
- 浮点数的加减运算
对阶 (小阶向大阶看齐)阶码相等
尾数加减(注意隐含位)
尾数规格化(左归右归)
尾数舍入(丢失精度)不影响结果是否溢出
溢出判断
- 类型转换后数值变化
int转float:float所表示的范围比int大得多,所以float能表示int,但float23位尾数不能表示int32位尾数,存在精度丢失。
int转double或 float转double:double所表示的范围以及尾数精度都要比int和float所表示的大,故能完全表示
double转float:float所表示的范围更小,故可能发生溢出和精度丢失
float或者double转int:大范围转小范围存在溢出截断和精度丢失
- 数据的大端小端存储
大端方式:先高字节,再低字节 (人类熟悉的方式 11111111 11110000 )
小端方式:先低字节,再高字节 (00001111 11111111)
- 对齐方式
边界对齐:
边界不对齐:
第三章
- 随机存储器RAM、只读ROM
存取方式、读写方式、断电后信息是否可保存(易失性)
- SRAM和DRAM的原理
六晶体MOS管,栅极电容(定期充电也就是刷新)
DRAM需要读后再生和定期刷新,集中刷新、分散刷新、异步刷新,行列地址分两次送,
- DSRAM容量计算
地址线复用技术:行地址和列地址通过相同的引脚分先后两次输入,地址引脚线可减少一半
按行刷新,故行列尽可能相同,行数 <= 列数
- 存储体、存储阵列,多模块存储器的关系是什么
层次关系:存储体是一个总的概念,而存储阵列和多模块存储器是存储体的具体实现形式。存储阵列可以包含多个存储体(如多个硬盘),而多模块存储器则是通过将多个内存模块组合在一起来提高性能。
协同作用:在实际应用中,多模块存储器可以作为存储体的一部分,通过存储阵列的方式来优化性能和可靠性。比如,一个服务器可能使用多模块的内存与硬盘阵列相结合,以满足高性能和数据安全的需求。
- 多模块存储器
高位交叉编址:地址的高位部分决定了数据存储在哪个模块
低位交叉编址:地址的低位部分决定了数据存储在哪个模块
每隔1/m个存储周期启动各模块,
访存冲突分析,对同一个模块的访问出现在一个周期内,则会出现冲突
- CPU和主存的链接
地址线、数据线、片选控制线或线选控制线
- 主存容量的扩充
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位默认为组号
- 磁盘存储器的组成和性能指标
驱动器 控制器 磁道 盘面 扇区
道密度、位密度、面密度
- 存取时间的计算
过程:先移动磁头道指定磁道上,确定盘面,最后旋转到指定扇区,最后读取数据
地质结构:柱面号(磁道号)+ 盘面号 + 扇区号
t = 寻道时间 + 旋转时间 + 传输时间
转速和时间t的关系?
数据传输速率 = R(转速)* N(磁道的容量)
- 高速缓存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 单次访存时间
- cache和主存的映射方式
直接相联(放入指定行): 标记 行号 块内地址
全相联(随意放):标记 块内
组相联(先分组 组内随意放):标记 组号 块内
访问过程
比较器的个数:直接相联仅需要一个比较器、全相联每行都需要一个比较器,组相连行间仅设置一个比较器,组内根据组数设置对应组数个比较器。
计算cache地址结构的位数和总容量
cache行所存储的内容:有效位、标记位、替换位、脏位、数据
- cache中主存块的替换算法
直接映射无需替换算法
常见的替换算法:算机算法(RAND)、FIFO(先进先出)、LRU(最近最少使用)、LFU(最不常用)
LRU替换位位数的计算:全相联(log2行数)、 组相连(log2组内数)
- 一致性问题(回写位)
cache写操作命中:全写法和回写法
cache写操作不命中:写分配法和非写分配法
- 虚拟存储器
虚拟地址和物理地址的转换
编译阶段:编译器将源代码转换为目标代码,生成相对地址(从0开始),但这些地址并不是真正的虚拟地址
链接阶段:链接器将多个目标文件合并,并处理外部引用。此时,仍然使用的是逻辑地址,而不是虚拟地址
装入阶段:在这一阶段,操作系统将程序加载到内存中,并为其分配虚拟地址空间。虚拟地址在此阶段被分配,并建立虚拟地址到物理地址的映射
虚拟地址是在装入阶段产生的
- 页表虚拟存储器
虚拟地址
普通:页号 页内地址
带页目录:页目录号 页号 页内地址
地址位数的计算:确定虚拟地址的位数,页的大小,是否带页目录
虚拟地址:页目录号 页号 页内偏移
物理地址:页框号 + 页内偏移
页目录项的组成 :(隐藏页号)、有效位、修改位、替换位、存取权限位、页框号
页号是固定的 里面存放的页框号不固定 如存在页面替换算法 将某个页号的内容替换为其他页框号
带TLB的查找过程:根据
TLB的地址组成(TLB采用组相连或者全相连映射):标记 组号 页内地址 / 标记 页内地址
TLB中的内容仅仅是页表的副本
cache和TLB中存放的都是page的副本
cache、TLB和page缺失组合分析:只要page未命中、其余均未命中
大题考数组的分页存储和缺页分析:int A[1024][1024]
确定数组A的起始地址,页的大小(4K),确定多少个数据占一页(4Bx1024 = 4K 1024个数据占一页),数组A占两页,再分析TLB的大小和cache的大小,计算哪几块会被调入从而避免访存。
- 段式虚拟存储器
按程序逻辑分段
地址结构: 段号 段内地址
根据段表基址寄存器 + 段号 找到对应的段表项
段表项的内容: 段首地址 装入位 段长
段首地址 + 段内地址 = 物理地址
存在两个越界判断:1、找对应的段表项 2、根据段长判断段内地址是否超出该段
- 段页式虚拟存储器
先把程序逻辑分段 再把段分固定大小的页
虚拟地址 = 段号 页号 页内地址偏移
寻址过程:
根据段表基址寄存器 + 段号 找到对应的段表项(并判断是否越界)
取出该段表项中的页表地址 + 页号 = 页框号
页框号 + 页内偏移 = 物理地址
- CISC和RISC
CISC复杂指令集,长度不等,采用微程序控制器,通用寄存器少
RISC精简指令集,长度固定,采用硬布线控制。通用寄存器多
CISC和RISC的对比
第四章
CPU如何区分指令和数据的?:CPU在指令执行的不同阶段区分,例如取指、间址、
- 指令地址的格式&根据指令格式生成对应的机器码
对应的机器码涉及到地址范围的采用补码形式!!!
地址位数和寻址范围:
| 操作码 | 地址 |
操作码用来标识进行何种操作 地址字段给出进行该操作所需要的数据等信息
- 指令字长
单字长 半字长 双字长指令(针对于机器字长)
- 指令格式
零地址:空操作、中断隐指令
一地址、二地址、三地址、四地址
根据各地址格式分析访存次数:访存次数需要确定寻址方式
- 拓展指令格式和定长操作码
定长操作码表明了系统可表示最大多少条指令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
零地址、一地址...对应子网号
- 操作码类型
数据传送、算术和逻辑运算、移位取反、转移等
区分跳转指令、调用指令、返回指令、条件转移指令的区别
详情看:指令
- 指令的寻址方式(区分指令寻址和数据寻址)
指令寻址:确定下一条待执行指令的地址
数据寻址:确定本条指令所需数据地址(解析地址码字段含义即数据寻址)
指令寻址 = 指令寻址 + 数据寻址
CPU执行一条指令都是根据PC中的内容取出该条指令的地址 从而进入取指阶段
- 指令寻址(PC自增大小和编址方式、指令字长的关系)
顺序寻址: PC+1(此处的1应为一条指令的长度 所以得确定编址方式 例如按字节编址 指令字长16 则pc+2)
跳跃寻址:使用转移指令实现,分为绝对转移(直接给出地址),相对转移(PC+偏移),目的都是修改pc的值,下一条指令的地址仍然由pc给出
- 数据寻址
寻址特征的作用(区分操作码)
计算操作数的地址,使用寻址特征字段来表示属于那种寻址方式。
| 操作码 | 寻址特征 | 形式地址 |
隐含寻址:隐含操作数的地址 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
- 汇编指令
常见的寄存器表示 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中 完成清栈 指向栈底 方便获取入口参数
过程体
结束阶段
第五章
- 微程序的控制方式
- 直接编码方式:每一位代表一个控制信息
- 字段直接编码方式:各个互斥类采用2^n编码方式
- 字段间接编码方式:通过微指令中的字段来决定下一条微指令的地址,从而实现灵活多变的控制流程
- 指令执行过程
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 |
第六章
第七章
- IO控制方式计算
CPU用于该IO控制方式的IO时间占整个CPU时间的百分比是多少?
程序轮训方式:
中断方式:每秒钟产生多少次中断 * 处理中断所需时钟周期数 / 主频
DMA方式:每秒钟产生多少次DMA请求 * 处理DMA所需时钟周期数 / 主频