计算机组成原理学习笔记(3)
计算机组成原理学习笔记(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
寻址方式
指令寻址
- 顺序寻址:PC自动加一
- 跳跃寻址:通过转移指令实现,分为绝对和相对,绝对为直接给出下条指令地址,相对为给出偏移量 PC加上偏移量
数据寻址
方式较多,为了区别在指令字设置一个寻址特征字段,用于指明寻址方式,位数决定寻址方式种类,格式如下
操作码+寻址特征+形式地址A
- 若为立即寻址,形式地址的位数决定了操作数的范围
- 直接寻址,位数决定可寻址范围
- 寄存器寻址,位数决定通用寄存器的最大数量
- 寄存器间接寻址,寄存器的位数决定可寻址的范围
常见的数据寻址方式
- 隐含寻址:不直接给出操作数的地址 例如:单地址指令隐含第二个操作数由累加器提供 只指明第一个操作数地址
- 立即寻址:地址字段给的不是地址,而是操作数本身 用补码表示
- 直接寻址:给的就是操作数的地址
- 间接寻址:给的不是操作数的地址而是操作数的有效地址在主存单元的地址
- 寄存器寻址:给出的是操作数所在寄存器的编号
- 寄存器简介寻址:寄存器中存的是操作数在主存单元的地址,先寄存器寻址再间接寻址
- 相对寻址:有效地址等于(PC)+A
- 基址寻址:EA = (BR)+ A BR为基址寄存器的内容
- 变址寻址:EA= (IX)+ A IX为变址寄存器 区别是 变址寄存器面向用户 用户可更改
程序的机器级代码表示
其中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(被调用者),过程调用的执行步骤如下:
- P 将入口参数(实参)放到 Q 能访问到的地方。
- P 将返回地址存到特定的地方,然后将控制转移到 Q。
- Q 保存 P 的现场(通用寄存器的内容),并为自己的非静态局部变量分配空间。
- 执行过程 Q。
- Q 恢复 P 的现场,将返回结果放到 P 能访问到的地方,并释放局部变量所占空间。
- 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中通用寄存器多
- 采用流水线,大部分指令在一个时钟周期完成
- 以硬布线控制为主,不用或少用微程序
- 重视编译优化