linux mips汇编指令集,mips汇编指令集功能的介绍

本文详细介绍了MIPS指令集,包括CISC与RISC的区别,MIPS指令的三种格式(R、I、J)及其用途,以及寄存器的作用。MIPS指令集的特点是32位指令,简单格式利于流水线操作,但代码密度较低。此外,文章还提及了编译过程、MIPS中的寄存器使用策略以及常用指令,如加载、存储、加法、条件转移等。

描述

简单来说,指令集就是CPU能看得懂的语音,可以称之为机器语言。

CPU指令集主要包括CISC(复杂指令集)和RISC(精简指令集)。

形象点说,

CISC类似于汉语,每一句话都是由汉字组成,而每一个汉字就相当于一条指令集;

RISC类似于英语,每一句话都是由字母组成,而每一个字母就相当于一条指令集;(这里不讨论什么汉字是笔画组成的,形象的比喻而已)

但是无论汉语和英语,都能实现人类基本交流。

例如:英语虽然只有26个字母,但是汉字却有几千个。但是有时候翻译表达同一个意思,往往比中文要复杂。比如中文的诗句,简单的几个汉字,就可以描述此次此刻的心境。

指令集就是cpu能读懂的指令,命令,就是人们预先定义好的,控制cpu如何工作的机器能读懂的机器语言。

知道了什么是指令集,这个时候还有一个概念就是编译。

编译其实就是把高级语言编程机器语言。也就是二进制的东西。烧录openwrt的时候,用hex编辑器打开看看,里面全是二进制代码,这些就是翻译后的机器语言。(当然,固件中处理指令集后,还有数据,数据就是普通的资源文件,不会去控制cpu)。

MIPS指令集就是MIPS架构的CPU能读懂的语言。

090bb486b06dd263b6a8943d7596e8e7.png

MIPS汇编

MIPS指令集

MIPS指令集属于精简指令集

MIPS的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。

简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大

MIPS有32个通用寄存器REG,为什么是32个而不是更多呢?

因为更多的寄存器需要更多的指令空间对寄存器编码,也会增加上下文切换的负担。

MIPS指令格式

R格式

ff2306bac6432d91af54fe6b20b93fc3.png

用处:

寄存器-寄存器ALU操作

I格式

5bc5c3b2986c1c8184b3af6bfb789081.png

用处:

加载/存储字节,半字,字,双字

条件分支,跳转,跳转并链接寄存器

读写专用寄存器

J格式

d5948a4e11b3cd3409e7ef634760db16.png

用处:

跳转,跳转并链接

陷阱和从异常中返回

各字段含义:

op:指令基本操作,称为操作码。

rs:第一个源操作数寄存器。

rt:第二个源操作数寄存器。

rd:存放操作结果的目的操作数。

shamt:位移量;

funct:函数,这个字段选择op操作的某个特定变体。

例:

add $t0,$s0,$s1 1

表示$t0=$s0+$s1,即16号寄存器(s0)的内容和17号寄存器(s1)的内容相加,结果放到8号寄存器(t0)。

指令各字段的十进制表示为:

8cf02a4e876a4dfac0c2154b5a232d18.png

MIPS指令

MIPS没有栈操作指令 ,调用子程序时没有自动压栈的call指令,只能用jal。

MIPS的内存映射、中断等功能都做到了协处理器0(cp0)中,浮点运算做到了协处理器1(cp1)中。

MIPS的寻址方式最简单,仅有寄存器加偏移寻址方式。

MIPS常用指令集

lb/lh/lw: 从存储器中读取一个byte/half word/word的数据到寄存器中。如 lb 1,0([Math Processing Error]2)

sb/sh/sw: 把一个byte/half word/word的数据从寄存器存储到存储器中。如 sb 1,0([Math Processing Error]2)

add/addu:把两个定点寄存器的内容相加add 1,[Math Processing Error]2,3([Math Processing Error]1=2+[Math Processing Error]3);u为不带符号加。 addi/addiu:把一个寄存器的内容加上一个立即数add 1,[Math Processing Error]2,#3(1=[Math Processing Error]2+3);u为不带符号加。

sub/subu:把两个定点寄存器的内容相减。

div/divu:两个定点寄存器的内容相除。

mul/mulu:两个定点寄存器的内容相乘。

and/andi:与运算,两个寄存器中的内容相与and 1,[Math Processing Error]2,3([Math Processing Error]1=2 &[Math Processing Error]3);i为立即数。

or/ori:或运算。

xor/xori:异或运算。

beq/beqz/benz/bne:条件转移eq相等,z零,ne不等。

j/jr/jal/jalr:j直接跳转;jr使用寄存器跳转;

lui:把一个16位的立即数填入到寄存器的高16位,低16位补零。

sll/srl:逻辑左移/右移sll 1,[Math Processing Error]2,#2。

slt/slti/sltui:如果2的值小于[Math Processing Error]3,那么设置1的值为1,否则设置[Math Processing Error]1的值为0。slt 1,[Math Processing Error]2,$3。

mov/movz/movn:复制,n为负,z为零。mov 1,[Math Processing Error]2; movz 1,[Math Processing Error]2,3([Math Processing Error]3为零则复制2到[Math Processing Error]1)。

trap:根据地址向量转入管态。

eret:从异常中返回到用户态。

32个通用寄存器

0($zero): 永远返回值为0

1($at): 用做汇编器的暂时变量

2-3(v0−[Math Processing Error]v1): 子函数调用返回结果

4-7(a0−[Math Processing Error]a3): 子函数调用的参数

8-15(t0−[Math Processing Error]t7): 暂时变量,子函数使用时不需要保存与恢复

16-23(s0−[Math Processing Error]s7): 子函数寄存器变量。子函数必须保存和恢复使用过的变量在函数返回之前,从而调用函数知道这些寄存器的值没有变化。

24-25(t8−[Math Processing Error]t9): 暂时变量,子函数使用时不需要保存与恢复

26-27(k0−[Math Processing Error]k1): 通常被中断或异常处理程序使用作为保存一些系统参数

28($gp): 全局指针。一些运行系统维护这个指针来更方便的存取“static“和”extern”变量。

29($sp): 堆栈指针

30(s8/[Math Processing Error]fp): 第9个寄存器变量。子函数可以用来做桢指针

31($ra): 子函数的返回地

cp0:协处理器0,MIPS对CPU的控制用cp0完成

add指令其实就是一条32位的“数据”,

bit0-bit5位命令号,即100000,为add指令

rd则是bit11-bit15

rt则是bit16-bit20

rs则是bit21-bit25

指令的意思(Purpose)是,把rs与rt相加值富裕rd(Description)。这里的rX的意思是cpu的寄存器,一般cpu都有r0-r12个寄存器,是cpu计算临时保存数据用的。

正常的数据是在ram中的,运算过程是:cpu有一条指令把数据搬到cpu的寄存器,然后计算完毕,再搬回去ram中。add即让cpu执行加运算,指令发给cpu后,cpu会调用内部的累加器执行加运算。如果学过数字电路的可能会清楚累加器的电路。

打开APP阅读更多精彩内容

点击阅读全文

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值