指令系统
指令
- 计算机能直接识别、执行的操作命令(机器指令);
- 冯诺依曼结构计算机 "程序控制"原理实现的载体
CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器
指令字长
指令中包含的二进制位数
与机器字长相比: 单字长、双字长、半字长等长度指令
多字长指令
- 解决寻址较大存储空间的问题
- 取指多次访问内存,影响速度,占用空间大
等长指令: 指令字长度固定。
变长指令: 指令字长度根据需要可变
指令的分类
- 根据计算机层次结构分类
- 根据指令中地址码字段的个数分类
根据指令中操作数的物理位置分类
- 存储器-存储器(SS)型
- 寄存器-寄存器(RR)型
- 寄存器-存储器(RS)型
根据指令的功能分类
- 数据传送指令 MOV 、PUSH/POP、 IN/OUT等
- 定点算术运算指令 ADD、SUB、INC、CMP、MUL等
- 位运算指令 NOT、AND、OR、SHL、SAL等
- 控制转移指令 JMP 、JNE、CALL、RET等
指令的格式
- 指令要求计算机完成什么功能? => 设置操作码
- 指令要求计算机处理什么数据? => 设置数据源/目
- 计算机怎样得到要处理的数据? => 设置寻址方式
操作码字段的位数与支持的最大指令数量有关
- 支持变长操作码时,操作码向不用的地址码字段扩展
寻址方式字段的位数与支持的寻址方式种类有关
地址码字段的作用及影响与其位数和寻址方式有关
指令系统
一台计算机中所有机器指令的集合
- 系列机:同一公司不同时期生产,基本系统结构和指令系统相同的计算机
- 兼容机:不同公司生产,基本系统结构和指令系统相同的计算机
函数调用
计算机是如何实现一层层嵌套的函数调用:
使用栈帧,调用一个方法,就把该方法的变量表、返回地址等压入栈来实现,当从当前方法返回,把当前方法的栈帧弹掉,此时就返回上一个方法了,这点跟JVM的实现是一样的
如果被调用的函数内部没有对其他函数的调用,可以执行一项叫做函数内联的优化,内联带来的优化是,CPU 需要执行的指令数变少了,根据地址跳转的过程不需要了,压栈和出栈的过程也不用了,是一种空间换时间的策略
寻址方式
根据冯诺依曼计算机的工作原理,需要根据物理地址从内存中去取指令和数据。如何获得指令和数据的物理地址?
指令的寻址方式
- 顺序寻址
程序的指令序列在主存顺序存放。执行时从第一条指令开始,逐条取出并执行
CPU中设置程序计数器(PC)对指令的顺序号进行计数。PC开始时存放程序的首地址,每执行一条指令,PC 加"1",指出下条指令的地址,直到程序结束
需要深刻理解 "+1" => 存储1条指令占用的字节单元数与存储字长有关!
- 跳跃寻址
操作数的寻址方式
当数据在主存中时, 需要计算其有效地址E
立即数寻址
地址码字段是操作数本身
特点:
- 取指操作将数据与指令一并读入CPU内部的寄存器,指令执行速度快
- 便于程序设计(变量赋初值)
- 数据大小受字段位数限制
寄存器寻址
操作数在CPU的内部寄存器中
特点:
- 操作数在寄存器中,指令执行速度快
- 能访问的数据大小一般与计算机字长有关
- 地址字段的位数与计算机通用寄存器数量相关
直接寻址
地址码字段直接给出操作数在内存的地址
- 提供访问主存的操作
- 获得数据要访问主存,指令执行速度慢
- 地址字段的位数决定了访存空间大小
间接寻址
地址码字段给出的是操作数主存地址的地址
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据要访问主存2次,指令执行速度太慢
寄存器间接寻址
地址码字段给出的是寄存器编号R
- 解决了直接寻址方式下地址字段的位数限制访存范围大小的问题
- 获得数据只需访问主存1次
相对寻址
E=D + (PC), D为指令中地址字段的值
- 可节省指令中的地址位数,便于程序在内存中成块移动
- 注意PC的改变对计算E的影响
基址寻址
指定一个基址寄存器B,与本指令地址无关
E= D + (B), D为指令中地址字段的值
变址寻址
指定一个变址寄存器X,与本指令地址无关, 内容可随要求改变,E= D + (X), D为指令中地址字段的值
- 不改变指令即可改变数据的有效地址,可在循环中使用
- 在字符串处理,向量运算等等成批数据处理中非常有用
使用寻址方式的好处 : 有利于缩短指令字长、方便程序设计、扩展访存空间
指令格式设计
- 根据指令数量的要求及是否支持操作码扩展,确定操作码字段的位数
- 根据对操作数的要求确定地址码字段的个数
- 根据寻址方式的要求,为每个地址码字段确定寻址方式字段位数
- 确定采用定长指令还是变长指令
MIPS指令
早期主要用于嵌入式系统,如Windows CE的设备,路由器,家用网关和视频游戏机,现在已经在PC机、服务器中得到广泛应用
特点
- 简单的Load/Store结构
- 易于流水线CPU设计
- 易于编译器开发
- MIPS指令的寻址方式非常简单,每条指令的操作也非常简单
指令格式
R型指令
操作数和保存结果均通过寄存器进行
- op:操作码,所有R型指令中都全为0;
- rs:寄存器编号,对应第1个源操作数;
- rt:寄存器编号,对应第2个源操作数;
- rd:寄存器编号,据此保存结果;
- shamt:常数,在移位指令中使用;
- funct:功能码,指定指令的具体功能
I 型指令
操作数中涉及立即数,结果保存到寄存器
- op:标识指令的操作功能;
- rs:第1个源操作数,是寄存器操作数;
- rt:目的寄存器编号,用来保存运算结果;
- imm:第2个源操作数,立即数
J 型指令
寻址方式
R型指令:由op和funct字段共同隐含说明当前的寻址方式
I型和J型指令:由op字段隐含说明当前指令使用的寻址方式