计算机组成原理学习笔记(3)

指令系统

ISA

所有指令的集合构成该机器的指令系统,又称指令集。是ISA(指令集体系结构最核心的部分)

ISA规定的内容包括

  • 指令格式,指令寻址方式,操作类型,每种操作对应的操作数的规定
  • 操作数类型,操作数寻址方式,大端法or小端法
  • 程序可访问的寄存器的编号,个数和位数,存储空间的大小和编址方式
  • 指令执行过程的控制方式等,包括程序计数器、条件码定义

指令格式

总体分为 操作码+地址码的形式

具体可分为

  • 零地址指令:仅有操作码op,没有显式地址。 如:空操作,停机,中断
  • 一地址指令:op+A1 如:+1 -1 求反 求补
  • 二地址指令:op + A1 +A2 指令含义:(A1)op (A2) 存到 A1
  • 三地址指令:与二地址不同的是存到A3
  • 四地址指令:与三地址不同的是 A4是下一条指令的地址

拓展操作码

一种典型方法 简单理解为 前面都是1代表操作码还未停止 读取到第一次 1111 代表后面为操作数

例题三道

在 CPU 执行指令的过程中,指令的地址由 ( ) 给出。

A. 程序计数器 (PC)
B. 指令的地址码字段
C. 操作系统
D. 程序员

设机器字长为 32 位,一个容量为 16MB 的存储器,CPU 按半字寻址,其寻址单元数是

()。

$B.2^{23}$

$A.2^{24}$

$C.2^{22}$

$D.2^{21}$

在指令格式中,采用扩展操作码设计方案的目的是( )。

A. 减少指令字长度

B. 增加指令字长度

C. 保持指令字长度不变而增加指令的数量

D. 保持指令字长度不变而增加寻址空间

设计某指令系统时,假设采用 16 位定长指令字格式,操作码使用扩展编码方式,地址码为 6 位,包含零地址、一地址和二地址 3 种格式的指令。若二地址指令有 12 条,一地址指令有 254 条,则零地址指令的条数最多为 ( )。

A. 0
B. 2
C. 64
D. 128

答案 ABCD

寻址方式

指令寻址

  1. 顺序寻址:PC自动加一
  2. 跳跃寻址:通过转移指令实现,分为绝对和相对,绝对为直接给出下条指令地址,相对为给出偏移量 PC加上偏移量

数据寻址

方式较多,为了区别在指令字设置一个寻址特征字段,用于指明寻址方式,位数决定寻址方式种类,格式如下

操作码+寻址特征+形式地址A

  • 若为立即寻址,形式地址的位数决定了操作数的范围
  • 直接寻址,位数决定可寻址范围
  • 寄存器寻址,位数决定通用寄存器的最大数量
  • 寄存器间接寻址,寄存器的位数决定可寻址的范围

常见的数据寻址方式

  • 隐含寻址:不直接给出操作数的地址 例如:单地址指令隐含第二个操作数由累加器提供 只指明第一个操作数地址
  • 立即寻址:地址字段给的不是地址,而是操作数本身 用补码表示
  • 直接寻址:给的就是操作数的地址
  • 间接寻址:给的不是操作数的地址而是操作数的有效地址在主存单元的地址
  • 寄存器寻址:给出的是操作数所在寄存器的编号
  • 寄存器简介寻址:寄存器中存的是操作数在主存单元的地址,先寄存器寻址再间接寻址
  • 相对寻址:有效地址等于(PC)+A
  • 基址寻址:EA = (BR)+ A BR为基址寄存器的内容
  • 变址寻址:EA= (IX)+ A IX为变址寄存器 区别是 变址寄存器面向用户 用户可更改

程序的机器级代码表示

1745150991162

其中ebp esp用处较为固定 前者为堆栈基指针 后者为堆栈顶指针

常见机器级指令

  • mov:将第二个数(寄存器,内存的内容,常数)复制到第一个数(寄存器或内存)
  • push:将操作数压入内存的栈 esp为栈顶 入栈前先将esp值减4
  • pop: 与push相反 如:pop eax将栈顶送入eax esp+4
  • add/sub :相加或相减 存在第一个操作数中
  • inc/dec:自加一自减一
  • imul:有符号数乘法 1.两个数乘 存在第一个数 2.三个数 将第二个与第三个相乘 存在第一个
  • idiv:有符号数除法 与乘法不同的是 只有一个操作数是除数 被除数为edx:eax的内容 64位 除法结束后商送到eax 余数动刀edx
  • and/or/xor:逻辑与或异或,两个操作数 存在第一个里
  • not:位翻转
  • neg: 取负
  • shl/shr:逻辑移位 l代表左移 r代表右移 第一个操作数是被移位的 第二个为移位的位数

控制流指令

  • jmp:无条件跳转
  • je:when equal
  • jz:when last result zero
  • jne:when not equal
  • jg:when greater
  • jge: when greater or equal
  • jl:when less
  • jle:when less or equal
  • cmp/test:cmp相当于 sub test 相当于 and 不同的是 他们不保存结果 仅根据结果设置CPU状态字里的条件码
  • call/ret:实现过程函数的调用和返回

过程调用的机器级表示

假定过程 P(调用者)调用过程 Q(被调用者),过程调用的执行步骤如下:

  1. P 将入口参数(实参)放到 Q 能访问到的地方。
  2. P 将返回地址存到特定的地方,然后将控制转移到 Q。
  3. Q 保存 P 的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间。
  4. 执行过程 Q。
  5. Q 恢复 P 的现场,将返回结果放到 P 能访问到的地方,并释放局部变量所占空间。
  6. Q 取出返回地址,将控制转移到 P。

步骤 2) 是由 call 指令实现的,步骤 6) 通过 ret 指令返回到过程 P。在上述步骤中,需要为入口参数、返回地址、过程 P 的现场、过程 Q 的局部变量、返回结果找到存放空间。

用户可见寄存器数量有限,调用者和被调用者需共享寄存器,若直接覆盖对方的寄存器,则会导致程序出错。因此有如下规范:寄存器 EAX、ECX 和 EDX 是调用者保存寄存器,当 P 调用 Q 时,若 Q 需用到这些寄存器,则由 P 将这些寄存器的内容保存到栈中,并在返回后由 P 恢复它们的值。寄存器 EBX、ESI、EDI 是被调用者保存寄存器,当 P 调用 Q 时,Q 必须先将这些寄存器的内容保存在栈中才能使用它们,并在返回 P 之前先恢复它们的值。

每个过程都有自己的栈区,称为栈帧,因此,一个栈由若干栈帧组成,寄存器 EBP 指示栈帧的起始位置,寄存器 ESP 指示栈顶,栈从高地址向低地址增长。过程执行时,ESP 会随着数据的入栈而动态变化,而 EBP 固定不变。当前栈帧的范围在 EBP 和 ESP 指向的区域之间。

CISC与RISC

CISC为复杂指令系统计算机 典型为x86

RISC为精简指令系统计算机 典型为ARM和MIPS

CISC

  • 指令系统庞大
  • 指令长度不固定,格式多,寻址方式多
  • 可以访存的指令不受限制
  • 各种指令使用频度相差大
  • 指令执行时间相差大,有很多需要多个时钟周期完成的指令
  • 控制器大多采用微程序控制,复杂指令甚至无法硬连线控制
  • 难以优化代码

RISC

  • 选取高频简单指令,复杂指令由简单指令符合
  • 指令长度固定,指令格式少,寻址方式少
  • 只有Load/Store访存,其余指令都在寄存器间进行操作
  • CPU中通用寄存器多
  • 采用流水线,大部分指令在一个时钟周期完成
  • 以硬布线控制为主,不用或少用微程序
  • 重视编译优化