Bits Bytes and Integers

Bits,Bytes and Integers

基础位运算

分清&,&&,| ,||,~,!之间的区别

位操作: &,|,~,运算时只是单纯进行位操作

逻辑比较: &&,||,!,运算时会添加逻辑考虑,

比如||前面的为True,则提前中止调用

又比如,对一个非0的数进行!两次会获得一个1,这和位操作有很大的区别

算术右移和逻辑右移

逻辑右移: 将整个数字向右移动,同时高位补0

算术右移: 将整个数字向右移动,同时高位按照符号位补充

左移的特殊情况

如果一个八位的数字进行左移八位的操作,在部分计算机中,这个8将被模8,因此并不能得到想象中的0

补码 T

国内讲法: 除了符号位,全部按位取反再加1

这课的讲法:最高位视为负权,如[-16,8,4,2,1]

经典图片

1663413629124

扩展

例如:8位->16位

基本规则:将符号位复制k份,k为扩展位数

解释,想象负数的情况,假设最高位权重暂时是-8,增加一位最高位,新增一位-16,但之前的最高位变为+8,刚好抵消。

加减乘除

无符号数直接不谈

补码加法: 可以通过补码加法简单得到减法,只要加上负的值就行

正/负溢出

正溢出:俩正数加起来等于一个负数

乘法

如果乘2的倍数,只需要【算术】移位就行了,不管是不是补码表示

除法

同样是算术移位,但这回如果是负数,它就不是四舍五入,而是向负无穷舍入,例如 -3/2=-2。而不是-1

获得相反数

按位取反再+1

一个恐怖的案例

1663426748805

这里,i会被隐式转换成unsigned int(因为sizeof是 unsigned int),于是这个for循环不会结束

无符号数的优点

由于无符号数的计算采用取模的方式

在一些模运算时(比如大多数加密算法)

当位表示集合而非数字时,用无符号数最好。

字存储

最低有效字节在小端序电脑中放在首位,在大端机器中放在末位

计组复习

指令系统

基本格式: 操作码| 地址码 (字节的整数倍)

地址码结构

四地址指令: A1 OP A2 -> A3 4次访存

三地址: 四地址-A3 (通过PC+1获得下一条指令位置) 4次访存

二地址: 三地址-A3 ( 结果存放在A1位置)4次访存

一地址: A_cc OP A1->Acc (Acc在累加寄存器中) 2次访存

零地址: 都在堆栈中

操作码

定长: 简化架构,但利用率低

变长:设计复杂,但同字节长度下可支持较多指令

编址方式

目的: 指出操作数的来源和去向

需要编址的:通用寄存器,主存,输入输出设备

编址单位

  1. 字编址
    编址单位=访问单位,每个编址单位所包含的信息量与读写寄存器所得的信息量相同
  2. 字节编址
    编址单位<访问单位
    编址单位和信息的基本单位(一个字节)相一致
  3. 位编址
    先不谈

地址码的位数

与主存容量成正比,和最小寻址单位成反比

数据寻址

目的:找到所需的操作数

  1. 立即寻址
    直接取出操作数
  2. 寄存器寻址
    给出寄存器编号,再访问寄存器取出操作数
  3. 直接寻址
    取出操作数再主存中的地址
  4. 间接寻址
    从主存中取出存放操作数地址的地址
  5. 寄存器间接寻址
    获取寄存器编号,寄存器中该编号存放操作数在主存的地址
  6. 变址寻址
    读取形式地址A加上变址寄存器Rx的值,获取真实地址
  7. 基址寻址
    读取位移量D,与基址寄存器中的值相加获得真是地址
  8. 相对寻址
    相对于基址寻址,由程序寄存器提供基准地址
  9. 页面寻址
    将整个主存空间分成若干个大小相同的页,每页有自己的编号,称为页面地址,业内的主存单元也有自己的编号,称为页内地址,操作数的有效地址就被分为:页面地址和页内地址两部分
    有三种页面寻址方式
    1. 基页寻址
      有效地址为 0//A (//为简单拼接)
    2. 当前页寻址
      页面地址为程序计数器PC的高位部分,有效地址为(PC)h // A
    3. 页寄存器寻址
      页面地址取自页寄存器,与形式地址拼接形成操作数有效地址
      EA=(页寄存器)//A

指令寻址

目的:寻找下一条要执行的指令地址

顺序寻址:

PC+1(程序计数器加1)

跳跃寻址:

通过程序转移类指令实现

直接、相对、间接寻址(详见数据寻址)

堆栈与堆栈操作

堆栈结构

  1. 寄存器堆栈
    一组专门的寄存器构成,栈顶固定,且组中寄存器互相连接,可将一个寄存器中的内容推移到另一个寄存器中去
  2. 存储器堆栈
    从主存中划出一块区域来当堆栈,大小可变,栈底固定,栈顶浮动,需要一个硬件寄存器作为堆栈栈顶指针SP
    PS: 栈底指针地址大于栈顶地址,因此进栈时,栈顶指针先减一,然后将数据压入指针指向的堆栈位置

堆栈操作(用途)

【一般计算机】

  1. 暂存中断断点
  2. 子程序调用时的返回地址
  3. 状态标志
  4. 现场信息
  5. 子程序调用时参数的传递

因此访问堆栈的指令只有进栈和出栈两种。

指令类型

数据传送类指令

用于寄存器与寄存器,寄存器与主存 ,主存与主存之间的数据传送

  1. 一般传送指令:将源地址的数据复制到目的地址
  2. 堆栈操作指令:因为堆栈(主存中开辟的)是一个特殊区域,因此对堆栈的操作也就是对存储器的操作
  3. 数据交换指令:将源操作数和目的地操作数相互交换位置

运算类指令

  1. 算术运算指令
  2. 逻辑运算指令
  3. 移位指令(算数移位【保持操作数符号不变,左移数值*2,右移数值/2】,逻辑移位【不管符号】,循环移位)

程序控制类指令

用于控制程序的执行方向,并使程序具有测试、分析与判断的能力

  1. 转移指令
    无条件(JMP): 直接吧程序转向新的位置执行
    条件转移:条件满足才转移
  2. 子程序调用指令
    子程序是一组可以公用的指令序列,只要知道地址就能调用
    主程序转向子程序称为子程序调用指令(CALL)
    子程序转向主程序成为转移指令(RET)
    一般使用堆栈保持返回地址
  3. 返回指令(RET)

输入输出类指令

实现主机与外部设备之间的信息交换

独立编址的IO

独立编址:外设端口和主存单元独立编址,指令系统有专门的IN/OUT指令,信息从外设到主机称为输入

指令中给出外设端口地址,这些地址是另一个独立的地址空间

统一编址的IO

指令系统没有专门的IO指令,用一般的数据传送类指令来实现

数值的机器运算

基本算数运算的实现

并行可以加快过程,但并行会使计算式过长,因此采用并串联合使用的方式取得性能和逻辑的平衡

  1. 单级先行进位方式
    组内并行,组间串行
  2. 多级先行进位方式
    组内并行,组间也并行

定点加减运算

补码加法:[X+Y]补=[X]补+[Y]补

减法也只是加补码求反后的结果

后面的先不看了

存储系统和结构

组成

按作用分类

  1. 高速缓冲存储器

位于主存和CPU之间

  1. 主存储器

CPU 可直接访问

  1. 辅助存储器

CPU不能直接访问

存取方式分类

  1. RAM 随机存取
    存取时间相同,随机读写访问
  2. ROM 只读
    特殊的RAM,只能读不能写
  3. SAM 顺序存取
    只能按某种顺序存取,存取时间与存储体上的物理位置有关
  4. DAM 直接存取存储器
    读取步骤: 第一步直接指向存储器中的某个小区域,第二部在小区域内顺序检索

存取层次结构

cache 主存 辅存 分为两个层次

Cache-主存 存储层次

目的:解决主存速度不足

方式: 在CPU和主存之间,增加辅助硬件,让他们构成一个整体,使CPU速度接近cache,容量接近主存

主存 - 辅存存储层次

目的:解决主存容量不足

主存储器的组织

基本结构

存储体

地址译码驱动电路

  • 译码器和驱动器,译码器将地址总线输入的地址吗转换成输出线上的有效电平,驱动器提供驱动电流去驱动相应的读写电路

IO和读写电路

存储单元

位: 二进制数的最基本单位,也是存储器存储信息的最小单位

存储字:一个二进制数由若干位组成,当这个二进制数作为一个整体存入或取出时,这个数称为存储字

存储单元(主存单元) 存放存储字或存储字节的主存空间,由计算机的结构确定。是CPU对主存可访问擦欧总的最小存储单位。

存储体: 大量存储单元集合构成一个存储体

技术指标

  1. 存储容量
    指主存所能容纳的二进制信息总量,对字节编址的计算机,以字节数表示,对字编址的计算机,以字数和字长的乘积来表示
  2. 存取速度
    2.1 存取时间
    从启动一次存储器操作到完成该操作所经历的时间
    2.2 存取周期
    指存储器进行一次完整的读写操作所需的全部时间,连续两次访问存储器操作之间所需要的最短时间
  3. 主存带宽
    每秒从主存进出信息的最大数量(字/秒或 字节/ 秒 或 位/ 秒)

半导体随机存储器和只读存储器

动态RAM的刷新

刷新方式

集中式

集中安排若干个刷新周期,刷新时停止读写操作

时间=存储体矩阵行数*刷新周期

分散式

把刷新操作分散到每个存取周期内进行,此时存取周期被分成读写和刷新两个部分。

异步式

把刷新操作平均分配到整个最大刷新间隔时间内进行

刷新间隔=最大刷新间隔时间/ 行数

主存容量的扩展