0x00 指令系统概述
指令 是用户使用计算机和计算机本身运行的最小功能单位
能被一台计算机执行的 全部指令的集合 称为 该机的指令系统(指令集)
指令形式:
机器指令:二进制表示,CPU能够识别
汇编指令:符号便是,便于人识别,汇编指令 和 机器指令之间是一对一的关系
0x01 指令系统作用
指令系统 位于 机器语言层(指令系统结构层),是机器语言程序员看到的计算机
指令系统结构层 是 计算机硬件 和编译器 都能理解的语言系统, 定义了编译器 和硬件 之间的接口
设计指令系统的核心问题:
设计指令的功能 和格式
指令功能 由 计算机的功能确定
指令格式 与 计算机字长,存储器容量,存储模式,寄存器组织等有关
0x01 指令系统结构层
指令系统结构层 主要定义(设计):
计算机的存储模式
寄存器组织
数据类型
指令系统
#存储模式
存储模式定义了:存储器结构,特殊存储器(堆栈),数据存储顺序,边界对齐等
(1)编址方式:按字节编址存储,即一个存储单元大小是一个字节。即8个存储元 构成一个存储单元
(2)数据存储顺序:大端存储(数据的低字节在高地址单元) 还是 小端存储
(3)边界对齐
当一个数据是 8字节的时候,我们定义边界对齐为 数据的起始地址 是8的倍数
当一个数据是 4字节的时候,我们定义边界对齐为 数据的起始地址 是4的倍数
(3)特殊存储器(堆栈)
在使用堆栈前,需要对堆栈的大小,在主存中的位置做出定义
使用堆栈时用三个专用的地址寄存器来管理:
Stack Pointer SP 堆栈指针 指向栈顶
Stack Base SB 堆栈基址 指向堆栈的最底部
Stack Limit SL 堆栈界限 指向堆栈的最顶端
堆栈界限 = 堆栈基址 ± 堆栈大小
两种堆栈设计方案:
堆栈界限SL > SB
SL < SB
非加载/存储体系结构:(复杂指令集系统)
存在除了load/store以外可以对内存进行读写的指令,例如:add AR,[0x 0001] 就含有读内存的操作
#寄存器组织
寄存器 是存储体系最上层的存储部件(速度最快,容量最小)
寄存器是软件设计者 唯一能够操作的CPU 内部资源
基本功能:
- 提供CPU运行所需的信息,
- 保存CPU运行结果
主要用途:
对频繁使用的数据进行快速访问
分类:
按照功能分类:
- 通用寄存器
- 专用寄存器
按照可操作性分类:
- 可见寄存器:指令系统结构层可见,可以程序访问,其中一部分用户程序可以访问(寄存器组),例如通用寄存器,另一部分只允许在内核模式下由操作系统使用
- 不可见寄存器:微体系结构层可见,指令系统结构层不可见,不可程序访问。
PC : Program Counter
Z 零标志:如果运算器的运算结果为0,则该位为1 表示true
S 符号标志:如果运算结果为负数,该位为1
C 进位标志:如果运算结果有进位 或者 借位,该位为1
V 溢出标志:如果运算结果发生了溢出,该位为1
P 奇偶标志:如果运算结果中1的个数是奇数个,该位为1
A 半价进位标志:一个字节分为4位一组 4位一组 ,如果低4位向高4位 有进位或者借位的话
该位为1
前5个标志位 可以 通过指令 来进行 检测 或者 修改
A标志 不可以通过指令 来进行检测
# 数据类型
#指令系统
指令设计:指令格式以及地址码设计
基本格式: 操作码+地址码
地址码字段格式 : 源操作数 + 目的操作数 + 下条指令的地址
根据地址码字段的组成,可以将指令如下分类:
四地址指令 = 操作码字段 + 目的操作数 + 源操作数 + 下条指令地址
指令设计:基本寻址方式
寻址方式:指令获取操作数的方式
两种呈现方式:
1.隐式寻址:由操作码决定其寻址方式
2.显式寻址:指令中设置寻址方式字段
## 隐含寻址
## 立即寻址
操作数(例如 0x12 ) 直接就放在 指令 中
##寄存器寻址
##直接寻址
## 间接寻址
需要两次访存操作
(X) 表示以X为地址的 内存单元的内容
## 寄存器间接寻址
##相对寻址
## 基址寻址
## 变址寻址
特殊之处:指令执行完之后,变址寄存器中的值 是可以自动变址的。
## 堆栈寻址
习题:
0x02 操作码设计
#定长操作码设计
定长操作码:所有指令的操作码位数相同
例如:如果操作码位数为n的话,那么理论上一共可以有2^n 种操作
一个计算机指令系统需要的指令数 N 必然<=2^n
一般RISC系统(精简指令集系统)当中采用此方式
例如Sun的SPARC指令系统
#变长操作码(aka 扩展操作码)
即不同类型的指令 采用 不同长度的操作码
设计原则:
1.如果指令的字长固定,那么地址码越长,操作码越短
2.如果指令的字长可变,以指令使用频度为依据,使用频度高的指令用短操作码
使用频度低的指令用长操作码 (哈夫曼编码原理,使得平均操作码长度尽可能短)
## 基于霍夫曼编码原理设计变长操作码
例1:
平均操作码长度 =∑ (每个操作码的编码长度 * 频率);
例2:
扩展操作码设计思路:
首先给使用频率为80%的操作码进行编码,一共20条指令 需要 5位
剩余了2^5 - 20= 16条 编码未使用
然后给使用频率为15%的80条指令进行编码,之前剩余的16条编码
肯定不够用,所以在原来的5位之后再添加3位 16 * 2^3 = 128>8
从扩展生成的新编码 中挑选80个。
例题:
扩展操作码的依据是 指令的条数。
每类指令不是独立进行编码的,而是在上一类指令剩余的编码的基础上扩展编码
## 基于特定规则扩展操作码
不同类指令之间区分码非常明显
例如15-15-15编码法中 第二类指令 就可以 和 第一类指令 通过高4位来区分
## 依据地址码数量扩展操作码
注意二地址指令理论上可以用11位,有2^11次方中编码
但是为了和已经设计好的三地址指令的开头不重复,所以只能在三地址指令
剩余的编码 之后扩展5位
什么三地址指令操作码有6位,但是指令数小于2^6 -1 而不是2^6?
因为三地址指令理论上 可以有2^6种编码,但是不能把2^6种全用完
至少必须保留1种不能使用,作为二地址指令的前缀(区分码)
0x03 指令设计
机器字长 一般指 计算机数据处理、数据传输的 二进制位数
重点:
0x04 主流指令系统
RISC 精简指令集(指令集 = 指令系统)
CISC 复杂指令集
#CISC 复杂指令集计算机(Complicated Instruction Set Computer)
#RISC 精简指令集计算机(Reduced Instruction Set Computer)
#典型指令系统:Intel指令格式及示例(CSIC典型代表)
#典型指令系统:MIPS指令系统(RISC典型代表)