引言
控制计算机需要使用计算机语言,语言的基本单词称为指令,一台计算机的全部指令称为计算机指令集。
所有计算机都是基于基本原理相似的硬件技术所构建的,另一面是因为所有计算机都必须提供一些基本操作。此外,计算机设计者都有一个共同的目标:找到一种语言,可方便硬件和编译器的设计,且性能最佳,同时使成本和功耗最低。
指令集存在什么地方?
CPU指令集是在CPU设计时固化在里面的"硬程序",整合在CPU的逻辑电路中。
如果把CPU看成是一个人,那么指令集就是交流的语言。如果要和CPU交流则必须使用它会的语言。
也可以这么理解:
把CPU看做是日常生活中的工具,指令集就是使用这个工具方法。但这个方法不存在任何地方(方法不能存储的),方法只在工具说明书中"说明"了
指令集架构的分类
CISC(Complex Instruction Set Computer 复杂指令集计算机):CISC每个指令可执行若干低阶操作,从内存读取、存储和计算操作,全部集中于单一指令。简单理解就是一个指令能干很多事,RISC指令做相同的操作需要多条指令。
RISC (Reduced Instruction Set Computer 精简指令集计算机): 起源于MIPS主机,具有设计更简单,设计周期更短等优点。
复杂和精简
这里的“复杂”和“精简”是指指令上的,即功能精简(一条指令只干极少的事),功能复杂(一条指令能做很多事)
机器周期
大多数计算机处理器都会不断地重复三个基本步骤。每个机器周期内会执行一条机器指令。一个现代的计算机处理器每秒钟运行数百万次机器周期。
一条机器指令是由一串对应着处理器基本操作的二进制码组成的,在不同的处理器架构中,机器周期的组成也不相同,但他们的基本行为都包含下面三个主要步骤:
- 从内存中读取指令:指令存放在内存中,PC (Program Counter) 存放了指令在内存中的地址
- PC=PC+4:让PC指向下一条指令所在的地址
- 执行所得到的指令
时钟周期、机器周期和指令周期
时钟周期: 也称为振荡周期,定义为时钟脉冲的倒数,是计算机中最基本的、最小的时间单位。
机器周期: 常把一条指令的执行过程划分为若干个阶段,每完成一个阶段所需要的时间称为机器周期。
指令周期: 执行一条指令所需要的时间,一般由若干个机器周期组成。指令不同,所需要的机器周期也不同。
从时间上来分区分: 指令周期 > 机器周期 > 时钟周期
硬件设计原则
- 简单源于规整: 比如加法指令,加法指令只有三个操作数,每个指令有且仅有三个操作数。操作个数的可变将给硬件设计带来更大的复杂性
- 越小越快: 比如寄存器非常小,但速度非常快
- 优秀的设计需要适应的折中方案: MIPS的所有指令长度相同,但指令的格式不一样(分为了R,I 类型),这是一种折中的体现(长度相同,指令格式相同,MIPS选择了前者)
CPU工作原理
图片取自:CPU工作原理
MIPS架构
介绍
英语:MIPS architecture,为Microprocessor without Interlocked Pipeline Stages的缩写,亦为Millions of Instructions Per Second的头字语
MIPS 是一种采用精简指令集(RISC) 的处理器架构
MIPS操作数
名字 | 示例 | 注释 |
---|---|---|
32个寄存器 | $0 $1 | 寄存器用于数据的快速存取。MIPS中只能对存放在寄存器中的数据只需算数操作 |
$2^{30} $ 个存储字 | Memory[0], Memory[4] … | 存储器只能通过数据传输指令访问。MIPS使用字节编址,所以连续的字地址相差4.存储器用于保存数据结构、数组和溢出的寄存器 |
寄存器
- 总共有32个通用寄存器
- 在汇编中,寄存器由$符开头
- 寄存器有两种表示方法一个是使用
REGISTER
($ 0) 一个是使用NAME
($zero)
REGISTER | NAME | USAGE |
---|---|---|
$0 | $zero | 常量0(constant value 0) |
$1 | $at | 保留给汇编器(Reserved for assembler) 可以用于加载大常数 |
$2-$3 | $v0 - $v1 | 函数调用返回值(values for results and expression evaluation) |
$4-$7 | $a0-$a3 | 函数调用参数(arguments) |
$8-$15 | $t0-$t7 | 临时寄存器(temp) |
$16-$23 | $s0-$s7 | 保存的(或如果用,需要SAVE/RESTORE的)(saved) |
$24-$25 | $t8-$t9 | 临时寄存器(temp) 为操作系统/异常处理保留,至少要预留一个 |
$28 | $gp | 全局指针(Global Pointer) |
$29 | $sp | 堆栈指针(Stack Pointer) |
$30 | $fp | 帧指针(Frame Pointer) |
$31 | $ra | 返回地址(return address) |
- $1, 保留,可以用于拆散和重装大常数
- $31 , 使用
jar address
跳转到某个地址(比如过程地址)时把下一条指令地址放到$ra 中。当过程执行完毕使用jr $ra
返回
指令类型
R型指令: 操作寄存器
指令格式:
- op: (Operation Code ) 操作码
- rs: (Source Register): 第一个来源寄存器
- rt: ( Target Register): 第二个来源寄存器
- rd: (Destination Register)目的地寄存器
- sham: Shift amount (number of bits the operation is shifted) 偏移量
- funct: function (function code) 功能,一般称为功能码,用于指明OP字段中操作的特定变式
包含的指令:
R-type | op | rs | rt | rd | shamt | func | |||
---|---|---|---|---|---|---|---|---|---|
add | 000000 | rs | rt | rd | 00000 | 100000 | add $1,$2,$3 | $1=$2+$3 | rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1 |
addu | 000000 | rs | rt | rd | 00000 | 100001 | addu $1,$2,$3 | $1=$2+$3 | rd <- rs + rt ;其中rs=$2,rt=$3, rd=$1,无符 |