MIPS指令集的常用指令分类和相关解释
MIPS(Microprocessor without Interlocked Pipeline Stages)是一种基于精简指令集(Reduced Instruction Set Computing,RISC)架构的32位微处理器。
MIPS指令集由约60条指令组成,支持基本的算术和逻辑运算、存储器访问、分支和跳转等操作,同时也支持异常处理和中断。MIPS架构的寄存器文件包含32个32位寄存器,其中0号寄存器始终为0,另外26个寄存器用于存储临时数据,而6个寄存器则用于存储函数调用和返回的地址。
1.立即数(immediate value)是指在指令中直接给出的数值,而不是从寄存器或内存中读取的数据。立即数通常用于作为操作数参与运算或者用于分支指令中给出跳转的偏移量。在MIPS指令集中,立即数通常是16位的有符号整数,可以表示范围从-32768到32767的数值。
2.offset:表示偏移量,是一个16位的有符号整数,表示要存储的地址相对于寄存器$s所指向的地址的偏移量。

R型指令用于寄存器之间的操作,如加减乘除等,指令格式中的操作码为000000。
这种指令涉及到寄存器之间的操作,使用3个寄存器进行操作。这些指令的操作码字段为6位,rs、rt、rd、shamt和funct字段的长度为5位。
其中,rs、rt分别表示源寄存器1和源寄存器2,rd表示目标寄存器,shamt字段用于移位操作,funct字段指定具体的操作类型。
例如,add $d, $s, $t指令就是一种R型指令。
其中,操作码表示指令的具体操作,第一个操作数寄存器和目标寄存器表示指令中涉及的寄存器编号,立即数表示指令中涉及的立即数的值。在MIPS指令集中,I型计算类指令的操作码通常为6位,rs和rt字段各占5位,imm字段占16位。
I型计算类指令是指立即数计算类指令,其操作码为6位,rs字段代表第一个操作数寄存器,rt字段代表第二个操作数寄存器,立即数字段表示立即数操作数。这类指令执行时,先将第一个操作数从寄存器中取出,再将立即数或者第二个操作数从寄存器中取出,经过计算后将结果存储到目标寄存器中。

I型指令用于取数和存数操作,立即数可以是有符号数或无符号数,操作码根据不同指令而不同。
这种指令涉及到立即数的操作,使用2个寄存器和一个立即数进行操作。这些指令的操作码字段为6位,rs、rt字段的长度为5位,immediate字段的长度为16位。
其中,rs表示源寄存器,rt表示目标寄存器,immediate表示立即数。
例如,addi $t, $s, imm指令就是一种I型计算类指令。

这种指令涉及到条件分支的操作,使用1个寄存器和一个偏移量进行操作。这些指令的操作码字段为6位,rs、rt字段的长度为5位,offset字段的长度为16位。
其中,rs表示源寄存器,offset表示偏移量,根据rs中的值进行条件分支操作。
例如,beq $s, $t, offset指令就是一种I型条件判断类指令。

直接跳转指令,如j、jal等。
算术和逻辑指令是MIPS指令集中最基本的指令之一,用于执行加、减、乘、除、与、或、异或等基本算术和逻辑运算。其中一些常用的指令如下:
将寄存器 r s 和 rs和 rs和rt的值相加,结果存入寄存器 r d 。具体步骤为:将 rd。具体步骤为:将 rd。具体步骤为:将rs和 r t 中的值视为有符号整数,将它们相加,将结果写入 rt中的值视为有符号整数,将它们相加,将结果写入 rt中的值视为有符号整数,将它们相加,将结果写入rd。例如,若 r s = − 5 , rs = -5, rs=−5,rt = 3,则$rd = $rs + $rt = -2。
将寄存器 r s 和 rs和 rs和rt的值相减,结果存入寄存器 r d 。具体步骤为:将 rd。具体步骤为:将 rd。具体步骤为:将rs和 r t 中的值视为有符号整数,将 rt中的值视为有符号整数,将 rt中的值视为有符号整数,将rt的值取反(即将其每一位取反再加1),然后将 r s 和 rs和 rs和rt取反后的值相加,最后将结果取反(即将其每一位取反再加1),将结果写入 r d 。例如,若 rd。例如,若 rd。例如,若rs = -5, r t = 3 ,则 rt = 3,则 rt=3,则rd = $rs - $rt = -8。
将寄存器 r s 和立即数 i m m 相加,结果存入寄存器 rs和立即数imm相加,结果存入寄存器 rs和立即数imm相加,结果存入寄存器rt。具体步骤为:将 r s 的值视为有符号整数,将其与立即数 i m m 相加,将结果写入 rs的值视为有符号整数,将其与立即数imm相加,将结果写入 rs的值视为有符号整数,将其与立即数imm相加,将结果写入rt。例如,若 r s = − 5 , i m m = 10 ,则 rs = -5,imm = 10,则 rs=−5,imm=10,则rt = $rs + imm = 5。
将寄存器 r s 和立即数 i m m 相加,结果存入寄存器 rs和立即数imm相加,结果存入寄存器 rs和立即数imm相加,结果存入寄存器rt。与ADDI的区别在于,ADDIU对立即数的符号不做特殊处理,而是视为无符号整数相加。具体步骤为:将 r s 的值视为无符号整数,将其与立即数 i m m 相加,将结果写入 rs的值视为无符号整数,将其与立即数imm相加,将结果写入 rs的值视为无符号整数,将其与立即数imm相加,将结果写入rt。例如,若 r s = 2 3 1 − 1 rs = 2^31-1 rs=231−1(即最大的有符号整数),imm = 10,则$rt = r s + i m m = 2 3 1 − 1 + 10 = − 2 31 + 9 。注意,由于 rs + imm = 2^31-1 + 10 = -2^{31} + 9。注意,由于 rs+imm=231−1+10=−231+9。注意,由于rt是一个32位寄存器,因此结果在存入$rt时会自动截断为32位。AND $rd, $rs, r t :将寄存器 rt:将寄存器 rt:将寄存器rs和 r t 的值进行按位与运算,并将结果存入寄存器 rt的值进行按位与运算,并将结果存入寄存器 rt的值进行按位与运算,并将结果存入寄存器rd。具体步骤为:将 r s 和 rs和 rs和rt中每一位进行逻辑与运算,将结果写入 r d 。例如,若 rd。例如,若 rd。例如,若rs = 10101100, r t = 01101011 ,则 rt = 01101011,则 rt=01101011,则rd = $rs & $rt = 00101000。
将寄存器 r s 和 rs和 rs和rt的值进行按位或运算,并将结果存入寄存器 r d 。具体步骤为:将 rd。具体步骤为:将 rd。具体步骤为:将rs和 r t 中每一位进行逻辑或运算,将结果写入 rt中每一位进行逻辑或运算,将结果写入 rt中每一位进行逻辑或运算,将结果写入rd。例如,若 r s = 10101100 , rs = 10101100, rs=10101100,rt = 01101011,则$rd = $rs | $rt = 11101111。
将寄存器 r s 和 rs和 rs和rt的值进行按位异或运算,并将结果存入寄存器 r d 。具体步骤为:将 rd。具体步骤为:将 rd。具体步骤为:将rs和 r t 中每一位进行逻辑异或运算,将结果写入 rt中每一位进行逻辑异或运算,将结果写入 rt中每一位进行逻辑异或运算,将结果写入rd。例如,若 r s = 10101100 , rs = 10101100, rs=10101100,rt = 01101011,则$rd = $rs ^ $rt = 11000111。
将寄存器 r s 和 rs和 rs和rt的值进行比较,如果$rs < r t ,则将寄存器 rt,则将寄存器 rt,则将寄存器rd的值设为1,否则设为0。具体步骤为:将 r s 和 rs和 rs和rt中的值视为有符号整数,比较它们的大小,如果$rs < r t ,将 rt,将 rt,将rd的值设为1,否则设为0。例如,若 r s = − 5 , rs = -5, rs=−5,rt = 3,则$rd = $rs < $rt = 1,因为-5小于3。
存储器指令是MIPS指令集中用于读取和写入存储器中的数据的指令。这些指令包括加载(load)和存储(store)指令,其中加载指令用于从存储器中读取数据并将其存储到寄存器中,而存储指令则用于将寄存器中的数据写入存储器中。以下是一些常用的存储器指令:
加载字(Load Word)指令,从内存中读取一个32位字(word)的数据,存储到寄存器 t 中。其中, t中。其中, t中。其中,s指定了内存地址的基地址,offset是一个16位的有符号立即数,表示相对于基地址的偏移量
存储字(Store Word)指令,将寄存器 t 中的 32 位数据存储到内存中。其中, t中的32位数据存储到内存中。其中, t中的32位数据存储到内存中。其中,s指定了内存地址的基地址,offset是一个16位的有符号立即数,表示相对于基地址的偏移量。例如,sw t 0 , 8 ( t0, 8( t0,8(s2)表示将 t 0 中的一个字的数据存储到内存地址 t0中的一个字的数据存储到内存地址 t0中的一个字的数据存储到内存地址s2+8处。lb:从存储器中加载一个8位的字节(byte)并将其存储到寄存器中。
该指令将寄存器 t 中的 8 位数据存储到以寄存器 t中的8位数据存储到以寄存器 t中的8位数据存储到以寄存器s的值加上偏移量offset所表示的内存地址中的一个字节中。例如sb t 0 , 0 x 20 ( t0, 0x20( t0,0x20(s3), t 0 的值为 0 x 34 , t0的值为0x34, t0的值为0x34,s3的值为0x100,要将$t0的值存储到地址0x120中。
分支和跳转指令是MIPS指令集中用于控制程序流程的指令。其中分支指令根据特定的条件改变程序的执行路径,而跳转指令则直接将程序转移到一个新的地址。以下是一些常用的分支和跳转指令:
如果寄存器 r s 和 rs和 rs和rt的值相等,则跳转到当前指令地址+ 4 + 4 × o f f s e t 处执行。具体步骤为:将 4+4×offset处执行。具体步骤为:将 4+4×offset处执行。具体步骤为:将rs和$rt的值进行比较,如果相等,则将程序计数器(PC)加上当前指令的地址+4+4×offset,跳转到该地址执行下一条指令。否则,执行下一条指令。offset是一个有符号的立即数,用于表示跳转的偏移量。
如果寄存器 r s 和 rs和 rs和rt的值不相等,则跳转到当前指令地址+ 4 + 4 × o f f s e t 处执行。具体步骤为:将 4+4×offset处执行。具体步骤为:将 4+4×offset处执行。具体步骤为:将rs和$rt的值进行比较,如果不相等,则将PC加上当前指令的地址+4+4×offset,跳转到该地址执行下一条指令。否则,执行下一条指令。offset是一个有符号的立即数,用于表示跳转的偏移量。
无条件跳转到目标地址执行。具体步骤为:将PC的高4位设置为当前指令的地址的高4位,将PC的低28位设置为目标地址的高4位×4,跳转到该地址执行下一条指令。目标地址是一个32位的地址,但只有高28位有效,低4位会被忽略。
将寄存器 r s 中的值作为目标地址跳转,并将下一条指令的地址存入寄存器 rs中的值作为目标地址跳转,并将下一条指令的地址存入寄存器 rs中的值作为目标地址跳转,并将下一条指令的地址存入寄存器rd。具体步骤为:将PC的值存入 r d ,将 rd,将 rd,将rs中的值设置为目标地址,跳转到该地址执行下一条指令。注意,$rs中的值必须是一个有效的地址,即它的低2位必须为0,因为跳转时会将最低的两位强制设置为0。
特权指令是MIPS指令集中用于操作特权级别的指令。这些指令只能由特权级别较高的程序执行,并且可以用于访问系统资源或执行特定的操作。以下是一些常用的特权指令:
用于在用户程序中发起系统调用(system call)。该指令没有任何操作数。执行SYSCALL指令时,CPU将会进入内核态,并跳转到一个特定的系统调用处理函数,通过该函数执行需要的操作。一般来说,系统调用是由操作系统提供的接口,用于实现进程管理、文件管理、网络通信等功能。
用于将协处理器0(CP0)的寄存器 r d 的值传送到通用寄存器 rd的值传送到通用寄存器 rd的值传送到通用寄存器rt中。CP0是MIPS体系结构中的一个特殊寄存器集合,用于实现对异常处理、中断控制、虚拟内存等方面的支持。MFC0指令的操作数中, r d 是一个 5 位的 C P 0 寄存器编号, rd是一个5位的CP0寄存器编号, rd是一个5位的CP0寄存器编号,rt是一个通用寄存器编号。执行MFC0指令时,CPU将会将指定的CP0寄存器的值传送到指定的通用寄存器中。
用于将通用寄存器 r t 的值传送到协处理器 0 ( C P 0 )的寄存器 rt的值传送到协处理器0(CP0)的寄存器 rt的值传送到协处理器0(CP0)的寄存器rd中。MTC0指令的操作数与MFC0指令相似, r d 和 rd和 rd和rt分别是CP0寄存器和通用寄存器的编号。执行MTC0指令时,CPU将会将指定的通用寄存器的值传送到指定的CP0寄存器中。通常,使用MTC0指令来配置CP0寄存器的值,例如配置异常处理向量表的基地址等。
MIPS指令集还提供了一组用于执行浮点运算的指令,这些指令用于对单精度浮点数和双精度浮点数执行基本算术和逻辑运算。以下是一些常用的浮点指令:
将单精度浮点寄存器 f s 和 fs和 fs和ft的值相加,将结果存储到单精度浮点寄存器 f d 中。具体步骤为:将 fd中。具体步骤为:将 fd中。具体步骤为:将fs和 f t 中的单精度浮点数进行加法运算,将结果写入 ft中的单精度浮点数进行加法运算,将结果写入 ft中的单精度浮点数进行加法运算,将结果写入fd中。例如,若 f s 表示 3.5 , fs表示3.5, fs表示3.5,ft表示1.25,则$fd = $fs + $ft = 4.75。
将单精度浮点寄存器 f s 和 fs和 fs和ft的值相减,将结果存储到单精度浮点寄存器 f d 中。具体步骤为:将 fd中。具体步骤为:将 fd中。具体步骤为:将fs和 f t 中的单精度浮点数进行减法运算,将结果写入 ft中的单精度浮点数进行减法运算,将结果写入 ft中的单精度浮点数进行减法运算,将结果写入fd中。例如,若 f s 表示 3.5 , fs表示3.5, fs表示3.5,ft表示1.25,则$fd = $fs - $ft = 2.25。
将单精度浮点寄存器 f s 和 fs和 fs和ft的值相乘,将结果存储到单精度浮点寄存器 f d 中。具体步骤为:将 fd中。具体步骤为:将 fd中。具体步骤为:将fs和 f t 中的单精度浮点数进行乘法运算,将结果写入 ft中的单精度浮点数进行乘法运算,将结果写入 ft中的单精度浮点数进行乘法运算,将结果写入fd中。例如,若 f s 表示 3.5 , fs表示3.5, fs表示3.5,ft表示1.25,则$fd = $fs * $ft = 4.375。
将单精度浮点寄存器 f s 的值除以 fs的值除以 fs的值除以ft的值,将结果存储到单精度浮点寄存器 f d 中。具体步骤为:将 fd中。具体步骤为:将 fd中。具体步骤为:将fs和 f t 中的单精度浮点数进行除法运算,将结果写入 ft中的单精度浮点数进行除法运算,将结果写入 ft中的单精度浮点数进行除法运算,将结果写入fd中。例如,若 f s 表示 3.5 , fs表示3.5, fs表示3.5,ft表示1.25,则$fd = $fs / $ft = 2.8。需要注意的是,如果除数为0,则结果为正无穷大或负无穷大。
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
我正在阅读SandiMetz的POODR,并且遇到了一个我不太了解的编码原则。这是代码:classBicycleattr_reader:size,:chain,:tire_sizedefinitialize(args={})@size=args[:size]||1@chain=args[:chain]||2@tire_size=args[:tire_size]||3post_initialize(args)endendclassMountainBike此代码将为其各自的属性输出1,2,3,4,5。我不明白的是查找方法。当一辆山地自行车被实例化时,因为它没有自己的initialize方法
如thisquestion,当在其自己的赋值中使用未定义的局部变量时,它的计算结果为nil。x=x#=>nil但是当局部变量的名称与现有的方法名称冲突时,就比较棘手了。为什么下面的最后一个示例返回nil?{}.instance_eval{a=keys}#=>[]{}.instance_eval{keys=self.keys}#=>[]{}.instance_eval{keys=keys}#=>nil 最佳答案 在Ruby中,因为可以在没有显式接收器和括号的情况下调用方法,所以在局部变量引用和无接收器无参数方法调用之间存在语法歧义:f
我使用Jekyll运行博客,并认为我会解决RedcarpetMarkdown解释器,因为它是developedandusedbyGitHub.好吧,我只是碰巧遇到了一个错误,去检查问题,然后foundthis.Maintainersays,"Asyouprobablyhavenoticed(harharharhar)Idon'thavetimetomaintainRedcarpetanymore.It'snotapriorityforme(IfindMarkdownthoroughlyboring)andit'snotapriorityforGitHub,becausewenolong
我正在尝试按Rails相关模型中的字段进行排序。我研究的所有解决方案都没有解决如果相关模型被另一个参数过滤?元素模型classItem相关模型:classPriority我正在使用where子句检索项目:@items=Item.where('company_id=?andapproved=?',@company.id,true).all我需要按相关表格中的“位置”列进行排序。问题在于,在优先级模型中,一个项目可能会被多家公司列出。因此,这些职位取决于他们拥有的company_id。当我显示项目时,它是针对一个公司的,按公司内的职位排序。完成此任务的正确方法是什么?感谢您的帮助。PS-我
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
假设您有一个可执行文件foo.rb,其库bar.rb的布局如下:/bin/foo.rb/lib/bar.rb在foo.rb的header中放置以下要求以在bar.rb中引入功能:requireFile.dirname(__FILE__)+"../lib/bar.rb"只要对foo.rb的所有调用都是直接的,这就可以正常工作。如果你把$HOME/project和符号链接(symboliclink)foo.rb放入$HOME/usr/bin,然后__FILE__解析为$HOME/usr/bin/foo.rb,因此无法找到bar.rb关于foo.rb的目录名.我意识到像rubygems这
我使用Ruby编程已经有一段时间了,现在只使用Ruby的标准MRI实现,但我一直对我经常听到的其他实现感到好奇。前几天我在读有关Rubinius的文章,这是一个用Ruby编写的Ruby解释器。我试着在不同的地方查找它,但我很难弄清楚这样的东西到底是如何工作的。我在编译器或语言编写方面从来没有太多经验,但我真的很想弄明白。一门语言究竟如何才能被自己解释?编译中是否有一个我不明白这有意义的基本步骤?有人可以像我是个白痴一样向我解释这个吗(因为无论如何这都不会太离谱) 最佳答案 它比你想象的要简单。Rubinius并非100%用Ruby编
电脑上可以截取图片吗?如果可以,该如何操作呢?相信很多小伙伴都只知道一两种截图的方式,知道的并不全面。其实,电脑上有多种方式截图的,而且非常方便。电脑怎么截图?今天我们就来教大家如何使用电脑截取图片的8种常用方式!操作环境:演示机型:Delloptiplex7050系统版本:Windows10方法一:系统自带截图具体操作:同时按下电脑的自带截图键【Windows+shift+S】,可以选择其中一种方式来截取图片:截屏有矩形截屏、任意形状截屏、窗口截屏和全屏截图。 方法二:QQ截图具体操作:在电脑登录QQ,然后同时按下【Ctrl+Alt+A】,可以任意截图你需要的界面,可以把截图的页面直接下载,