指令集(Instruction Set):一个给定的计算机体系结构所包含的指令集合。
不同的CPU所支持的指令集不同,流行的指令集有:ARMv7、Intel x86、ARMv8、MIPS等。
高级语言编写的程序被编译成汇编代码,汇编器将汇编代码编译成机器语言代码(即计算机指令)存储在存储器中,运行时,CPU将程序装载进内存,一条条的依次执行。
常见的指令分类
- 算数指令
- 数据传输指令
- 逻辑类指令
- 控制类指令
操作数
寄存器
MIPS中寄存器,受指令格式位数(5位,共 个)的限制,只有 个。
MIPS | x86 | ||||
名称 | 寄存器编号 | 说明 | 过程调用时必须保存 | 操作数 | 说明 |
\$zero | 0 | 寄存器0,其值恒为0 | -- | ||
\$at | 1 | 汇编器保留 | -- | ||
\$v0 - \$v1 | 2-3 | 过程调用时,用于返回值的2个寄存器 | 否 | ||
\$a0 - \$a3 | 4-7 | 过程调用时,用于传递参数的4个寄存器 | 否 | ||
\$t0 - \$t7 | 主要用于编译时临时所需 | 否 | |||
\$s0 - \$s7 | 16-23 | 保存的寄存器 | 是 | ||
\$t8 - \$t9 | 24-25 | 更多临时变量 | 否 | ||
\$k0 - \$k1 | 26-27 | 操作系统保留 | -- | ||
\$gp | 28 | 全局指针 | 是 | ||
\$sp | 29 | 栈指针 | 是 | ||
\$fp | 30 | 帧指针 | 是 | ||
\$ra | 31 | 过程调用时,用于返回起始点的返回地址寄存器 | 是 | ||
存储器
存储器只能通过数据传输指令
访问。
- MIPS中存储器有 个
MIPS | x86 | ||
操作数 | 说明 | 操作数 | 说明 |
m[0]、m[4]... | MIPS通过字节编址,所以连续的字地址相差4 | 操作数 | 说明 |
对齐限制
MIPS
采用 大端 编址,按字节编址,字的起始地址必须是 的倍数。
指令格式
指令的布局形式叫做指令格式。
MIPS指令格式
MIPS指令格式占 32
位,与字长相同。不同类型的指令采用不同的指令格式。虽然多种指令格式使硬件变得复杂,但是保持指令的类似性,可以降低复杂度。
R型指令结构(适用于寄存器)
op
:指令的基本操作,称为操作码(opcode),具体操作由funct
字段决定;rs
:第一个源操作数寄存器(位移指令为0
);rt
:第二个源操作数寄存器;rd
:用于存放操作结果的目的寄存器;shamt
:位移量,适用于位移指令;funct
:功能码(function code),用于指定op
字段中操作的特定变式。
I型指令结构(适用于立即数或基址寻址操作)
op
:指令的基本操作,称为操作码(opcode);rs
:- 数据传输指令中的基址寄存器;
- 立即数运算指令中的操作数计算器;
rt
- 取字指令中的目的寄存器;
- 存字指令中的源寄存器;
- 立即数运算指令中的源寄存器;
constant
oraddress
- 数据传输指令中的地址偏移量
- 立即数运算中的常数
16位的地址字段,意味着取字指令可以取相对于基址寄存器地址偏移 或 ()个字节或 个字范围内的任意数据字。
J型指令结构(适用于地址跳转)
op
:操作码address
:跳转地址
寻址模式
寻址模式是指:根据对操作数或地址的使用不同加以区分的多种寻址方式中的一种。
立即数寻址
立即数寻址(Immediate Addressing),操作数是位于指令自身中的常数。
MIPS中的立即数寻址
寄存器寻址
寄存器寻址(Register Addressing),操作数是寄存器。
基址寻址
基址寻址(Base Addressing)又称偏移寻址(Displacement Addressing),操作数在内存中,其地址是指令中基址寄存器和常数的和。
此种寻址方式非常适合存储数组和结构,基址存储器指向变量的首地址,偏移量用于指定对应的元素下标。
PC相对寻址
PC相对寻址(PC-relative Addressing),地址是PC和指令中常数的和。
伪直接寻址
伪直接寻址(Pseudodirect Addressing),跳转地址是指令中26位字段和PC高位相连。