书小宅之计算机组成原理——MIPS指令

MIPS-32【Million Instructions Per Second】

汇编语句的格式

[标号:] 指令助记符 第1操作数 [, 第2操作数 [, 第3操作数]] [# 注释]

  • [ ]中的内容为可选项
  • 标号和指令助记符都 不区分字母的大小写
  • 汇编代码是以行为单位的,不支持一行内有多条指令
  • “#”到 行末 的是注释部分,但要注意,“#”不要出现在一行的最左列,因为最左列的“#”表示要启用C预编译器
  • 标号可以是以英文字母开头的字母-数字串,可以由字母、数字、下划线,“$”和“.”组成,长度不超过8个字符。注意不要和保留字重名。

32位为一组的二进制称为一个“字”,在MIPS中字的起始地址必须是4的倍数。
MIPS采用大端编址:使用最左边字节的地址作为字地址。

寄存器
在MIPS体系结构中有32个32位的定长寄存器,MIPS约定“$”后面跟两个字符来代表一个寄存器。由编译器负责将程序变量和寄存器对应起来。

寄存器是计算机中保存数据最快的位置,用于数据的快速存取,与存储器相比,寄存器访问时间短,吞吐率高,功耗小。只能对存放在寄存器中的数执行算术操作算术运算指令的操作数必须来自于寄存器。

程序计数器:保存当前运行指令的地址的寄存器。

环出寄存器的最理想的数据结构是栈——一种后进先出的队列:将数据放入栈中称为压栈,从栈中移除数据称为出栈。

寄存器的溢出:将不常使用的变量(或稍后才使用的变量)存回存储器的过程。

寄存器号寄存器名称作用
$0$zero常数0,该寄存器永远只返回0。
$1$at用做汇编器的暂时变量。
$2-$3$v0 - $v1用来存放一个子程序(函数)的非浮点运算的结果或返回值。
$4-$7$a0 - $a3存放子程序(函数)调用时的非浮点参数。
$8-$15$t0 - $t7暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。
$16-$23$s0 - $s78个子程序用寄存器。子程序(函数)必须在返回之前恢复这些寄存器的值以保证其没有变化。
$24-$25$t8 - $ t9暂时变量,子程序(函数)使用时不保存这些寄存器的值,因此调用后它们的值会被破坏。
$26-$27$k0 - $ k1为中断/异常处理保留。由操作系统的异常或中断处理程序使用,不恢复原来的值。
$28$gp全局指针。某些运行时系统用来为Static或Extern变量提供简单的访问方式。
$29$sp堆栈指针,对它的调整必须显式的通过指令来实现,硬件不支持堆栈指针的调整。
$30$fp第9个子程序用寄存器变量,子程序用它做堆栈帧指针。
$31$ra存放调用子程序(函数)时的返回起始点的返回地址寄存器。

存储器:有2^39个,相当于一个很大的一维数组,根据存储器地址(数组下标)访问存储器中的。只能通过数据传输指令访问,用于保存数据结构、数组和溢出的寄存器。

常数操作:常数在加载程序的时候被放入存储器,使用时必须先从存储器中取出来。‘
立即数操作:直接采用一个操作数是常数的指令。(如addi)【lw指令可以看作一个操作数是0的加法】

无符号整数:负地址是没有意义的,处理此类仅能是正的数需要用无符号整数(unsigned int)。
符号扩展:取回有符号数后需要使用符号位填充寄存器的所有剩余位。将n位立即数扩展为32位,将扩展后的数据的高(32-n)位置复制为立即数的最高位。
无符号扩展:直接将扩展后的数据的高(32-n)位置为0。

16位立即数无符号整数有符号整数
0x80000x000080000xFFFF8000
0x10000x000010000x00001000
无符号数的最高有效位是符号位,而无符号数的最高有效位是具有最大权重的位。

基本块:分支仅可能出现在代码末尾、分支目标和分支标签仅有可能出现在代码起始位置的指令序列。

MIPS的31种指令

R指令

R格式指令为纯寄存器指令,所有的操作数(除移位外)均保存在寄存器中。Op字段均为0,使用funct字段区分指令。
在这里插入图片描述
不使用shamt字段时,该字段为0。
在这里插入图片描述
在这里插入图片描述
AND:表示按位与,提供了一种将源操作数中某些位置为0的能力,前提是另一个操作数中对应位为0,这个操作数被称为掩码。
OR:表示按位或,该操作在两个操作位中任意一位为1时结果就为1.
NOT:表示按位取反,仅有一个操作数。
在这里插入图片描述
第一类逻辑操作称为移位:shift。他们将一个字里面的所有位都向左或向右移动,并在空出来的位置上填上0。
在这里插入图片描述

I指令

I格式指令为带立即数的指令,最多使用两个寄存器,同时包括了load/store指令。使用Op字段区分指令。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
lui:专门用于设置寄存器中常数的高16位置,将高16位立即数量值存放到寄存器的高16位,低16位用0填充。允许后续指令设置常数的低16位。
数据传送指令:在寄存器和存储器之间传送数据。
取数指令load/lw:将数据从存储器拷贝到寄存器的数据传送指令。
存数指令store/sw:将数据从寄存器拷贝到存储器的数据传送指令。

条件分支指令:
在这里插入图片描述

J指令

J格式指令为长跳转指令,仅有一个立即数操作数。使用Op字段区分指令。
在这里插入图片描述
在这里插入图片描述

MIPS寻址方式总结

  • 立即数寻址:操作数是位于指令自身中的常数,指令中第3操作数可使用16位二进制立即数;
  • 寄存器寻址:操作数存放在寄存器中,指令里放的是寄存器号;
  • 变址寻址:操作数存放在数据存储器中,其有效地址由两部分组成,基地址放在一个寄存器中,偏移部分为一个16位的立即数;
  • 基址或偏移寻址:操作数在内存中,其地址是指令中基址寄存器和常数的和;
  • PC相对寻址:操作数是下一条指令的PC值(PC+4)加上指令中16位偏移量常数的和;
  • 伪直接寻址:26位偏移地址+PC高位相连而成。
    attention:一种操作可以使用不止一种寻址模式。

需要注意的问题

  • 误解1、更强大的指令意味着更高的性能。

  • 误解2、使用汇编语言编程来获得更高的性能。

  • 误解3、商用计算机二进制兼容性的重要性意味着成功的指令集不需要改变。

  • 陷阱1、忘记在字节寻址的机器中,连续的地址相差4.

  • 陷阱2、在自动变量的定义过程外,使用指针指向该变量——使用指向一个过程中局部数组的指针,从该过程传出结果。

敬请批评指正!

  • 12
    点赞
  • 62
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MIPS指令译码器是计算机组成原理中非常重要的组成部分,它的主要作用是将MIPS指令转换成计算机能够执行的操作。下面是一个简单的MIPS指令译码器的设计。 首先,需要定义MIPS指令的格式,MIPS指令格式一般包含操作码和操作数。操作码是指定指令类型的字段,操作数是指令中需要操作的数据和寄存器。 接下来,根据MIPS指令的格式,设计一个译码器。译码器的输入是MIPS指令,输出是对应的操作数和操作码。译码器的主要功能是解析指令并确定其类型,识别操作数并从指令中提取数据。 例如,对于MIPS指令“add $t0,$t1,$t2”,操作码为“add”,操作数分别为$t0、$t1、$t2。译码器需要解析指令,确定其类型为“add”指令,并提取操作数$t0、$t1、$t2。 下面是一个简单的MIPS指令译码器的设计: 1. 首先,将MIPS指令的操作码字段提取出来,比较该操作码与已知的指令类型,以确定该指令的类型。 2. 根据指令类型,提取操作数,比如对于“add”指令,需要提取三个寄存器$t0、$t1、$t2,分别对应指令中的第一个、第二个和第三个操作数。 3. 将操作数和操作码输出,供后续的执行单元使用。 需要注意的是,MIPS指令译码器的设计需要考虑到各种可能的指令类型和操作数的组合,以确保译码器能够正确解析所有指令。同时,译码器还需要具有高效和快速的性能,以保证计算机的运行速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值