当前位置: 代码迷 >> 综合 >> 计算机组成与体系结构:第五章 指令系统
  详细解决方案

计算机组成与体系结构:第五章 指令系统

热度:62   发布时间:2024-02-09 03:50:25.0

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 内部资源

基本功能:

  1. 提供CPU运行所需的信息,
  2. 保存CPU运行结果

主要用途:

对频繁使用的数据进行快速访问

分类:

按照功能分类:

  1. 通用寄存器
  2. 专用寄存器

按照可操作性分类:

  1. 可见寄存器:指令系统结构层可见,可以程序访问,其中一部分用户程序可以访问(寄存器组),例如通用寄存器,另一部分只允许在内核模式下由操作系统使用
  2. 不可见寄存器:微体系结构层可见,指令系统结构层不可见,不可程序访问。

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典型代表)