linux精简指令集,精简指令集(MIPS为例)常用指令特点及其格式

精简指令集(MIPS为例)常用指令特点及其格式

一、指令集

指令集是指一台计算机的全部指令;不同的计算机有不同的指令集,但是在许多方面都有共同之处。早期的计算机有非常简单的指令集:实现简单,许多现代计算机也有简单的指令集。因此,指令集具有精简指令集(RISC)与复杂指令集(CISC)之分,本文主要介绍精简指令集,并以其中的MIPS为例展开。

二、设计原则

设计原则1: 简单源于规整

规整使得实现更简单

简单使得以较低成本实现更高性能成为可能

设计原则2: 越小越快

设计原则3: 加速执行常用操作

小常数出现频率高

立即数操作避免load指令

设计原则4:优秀的设计需要适宜的折中方案

不同的指令格式使译码变得复杂, 但是允许所有指令统一32-bit 字长

使格式尽可能相似

三、常用指令

常用指令汇总

add rd,rs,rt

rd=rs+rt;

sub rd,rs,rt

rd=rs-rt;

addi rt,rs,constant

rt=rs+constant;

lw rt,rs,constant

rt=Address(rs+constant/4);//Address(rs+constant/4)表示:rs对应的数组,索引为constant/4的取值

lw rt,rs,constant

Address(rs+constant/4)=rt;

sll rt,rs,constant

rt=rs<<4;

srl rt,rs,constant

rt=rs>>4;

and rd,rs,rt

rd=rs&rt;//按位与,还有andi

or rd,rs,rt

rd=rs|rt;//按位或,还有ori

nor rd,rs,rt//rt取$zero

rd=rs~rt;//按位取反

beq rs,rt,L1

if (rs == rt) 分支跳转到指令L1;

bne rs, rt, L1

if (rs != rt) 分支跳转到指令L1;

j L1

无条件跳转到指令 L1

slt rd,rs,rt

if (rs

slti rt,rs,constant

if (rs

带符号数比较:slt, slti

无符号数比较:sltu, sltiu

例如:

$s0 = 1111 1111 1111 1111 1111 1111 1111 1111

$s1 = 0000 0000 0000 0000 0000 0000 0000 0001

slt $t0,$s0,$s1 # signed

–1 < +1 ===> $t0 = 1

sltu $t0,$s0,$s1 # unsigned

+4,294,967,295 > +1 ===> $t0 = 0

jal 过程标签l

跳转到目标地址

jr $ra

复制 $ra的内容到程序计数器PC

lb rt, offset(rs) lh rt, offset(rs)

在 rt中用符号位扩展到32 bits

lbu rt, offset(rs) lhu rt, offset(rs)

在 rt中用0扩展到32 bits

sb rt, offset(rs) sh rt, offset(rs)

只存储最右边的字节/半字

lui rt, constant

复制16-bit 常数值 到rt的高16位,将rt 的低16位清为 0

链接取数:ll rt, offset(rs)

条件存数:sc rt, offset(rs)

linux精简指令集,精简指令集(MIPS为例)常用指令特点及其格式_第1张图片

寄存器用法

$a0 – $a3:参数寄存器 (reg’s 4 – 7)

$v0, $v1:结果值寄存器(reg’s 2 and 3)

$t0 – $t9:临时寄存器,用于存储临时值,可以由被调用者重写

$s0 – $s7:保留寄存器,用于存储变量,必须由被调用者保存/恢复

$gp:静态数据的全局指针(reg 28)

$sp:栈指针(reg 29)

$fp:帧指针(reg 30)

$ra:返回地址(reg 31)

过程调用步骤

1.将参数放在寄存器中

2.将控制转移给过程

3.获得过程所需的存储资源

4.执行过程的操作

5.将结果放在调用者可以访问到的寄存器

6.返回调用点

四、32位指令格式

R-格式指令

cdde4619af95d376e2855fa8f71d9b72.png

op:操作码(opcode)

rs:第一源操寄存器号

rt:第二源操寄存器号

rd:目的寄存器号

shamt:移位的位数(其它指令为00000)

funct:功能码(扩展操作码)

I-格式指令

55a14c60cdbe0f28167ef2766834ccad.png

立即数运算和load/store指令

rt:源寄存器号(store指令)或目的寄存器号(立即数运算和load指令)

立即数:–215 — +215 – 1

地址:rs中的基地址加上偏移量

J-格式指令

8b30c4d41b5b7d1468dadc73d9f04dd9.png

跳转 (j和jal) 目标地址可以是代码段的任意位置

本文同步分享在 博客“使君杭千秋”(CSDN)。

如有侵权,请联系 [email protected] 删除。

本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

你可能感兴趣的:(linux精简指令集)