《初学计算机组成原理之MIPS指令集及汇编》

MIPS指令集及汇编


前言

本篇基于《计算机组成与设计:硬件、软件》和其他博客资料(链接放在文章尾部),供本人学习记录用,若有错漏欢迎指正

一、从指令讲起

MIPS指令集,就是计算机的“方言”手册,通过这些指令来操作计算机。那么,指令在计算机中是如何表示的呢?
指令在计算机内部是以若干或高或低的电信号的序列表示的,并且在形式上和数的表示相同。实际上,指令的各部分都可以看做一个独立的数,将这些数拼接在一起就形成了指令。
讲具体指令前,要先讲一下寄存器。几乎所有的指令都要用到寄存器,想象一下,如果你要执行加法操作,是不是要传值到计算机,然后还要把它们加起来然后传回结果地址处,这就要用到寄存器去存它们的值和结果,其他操作也类似,所以寄存器至关重要。

(1)寄存器

MIPS 包含32个通用寄存器 ($0-$31均为32 位)
在这里插入图片描述

(2)指令的表示
R型格式(register format)

在这里插入图片描述

  • op:指令的基本操作,opcode
  • rs: 第一个源操作数寄存器
  • rt: 第二个源操作数寄存器
  • rd: 用于存放操作结果的目的寄存器
  • shamt:位移量,用于 sll, srl 等指令
  • funct: 功能码。用于和op搭配使用,指示操作
I 型格式(Immediate format)

在这里插入图片描述

  • constant or address: 存放立即数或者地址
J型格式(Jump format)

在这里插入图片描述

  • 用于无条件跳转指令,一条32位的MIPS J型指令 划分为 2 个字段: 6 + 26 = 32bit

例子:
在这里插入图片描述

二、MIPS汇编语言

相关指令总览表:

在这里插入图片描述
在这里插入图片描述

应用举例

1.赋值语句
C语言:f=(g+h)-(i+j);

变量f,g,g,i,j分别分配给寄存器$s0,$s1,$s2,$s3,$s4
MIPS代码:
add $t0,$s1,$s2   #$to=g+h
add $t1,$s3,$s4   #$t1=i+j
sub $s0,$t0,$t1   #f=(g+h)-(i+j)
C语言:A[300]=h+A[300];

A的基地址放在$t1,h放在$s2
MIPS代码:
lw $t0,1200($t1)  #取A[300]的值,由于系统按照字节寻址,而且这里默认数组为int型,故300*4
add $t0,$s2,$t0   #h+A[300]
sw $t0,1200($t1)  #计算结果写回A[300]的位置

在这里插入图片描述
在这里插入图片描述

2.决策指令:条件分支、循环
C语言:while(save[i]==k)i+=1;

i,k存在$s3,$s5,save基地址存在$s6
MIPS编码:
LOOP:sll $t1,$s3,2  #i*4
add $t1,$t1,$s6
lw  $$t0,0($t1)      #$t0=save[i]
bne $t0,$s5,Exit
addi $s3,$s3,1       #i=i+1
j LOOP
Exit:

这个嵌套循环的例子需要好好看看:(可以有多种写法,但这种是比较规范的)
在这里插入图片描述
在这里插入图片描述
以下计算阶乘的递归例子用到了 “栈”

int fact(int n)
{
    if(n<1)return(1);
    else return(n*fact(n-1));
}
n对应$a0,由于要反复用到n且改变其值,故要在栈中保存它,还要保存返回地址
fact:
addi $sp,$sp,-8    #为两个值预留栈内空间
sw   $ra,4($sp)    #$ra用于记录返回地址,保存返回地址到栈中
sw   $a0,0($sp)    #保存a

slti $t0,$a0,1     #if(n<1)
beq $t0,$zero,$L1  #if(n>=1)go to L1

addi $v0,$zero,1   #return 1
addi $sp,$sp,8     #pop栈内值
jr   $ra           #跳转到返回地址

L1:
addi $a0,$a0,-1   #if(n>=1)n-1
jal fact          #递归调用fact(n-1)

lw   $a0,0($sp)   #恢复n值
lw   $ra,4($sp)   #恢复返回地址
addi $sp,$sp,8    #pop栈内值

mul  $v0,$a0,$v0  #rreturn n*fact(n-1)
jr   $ra          #跳到返回地址

三、补充:寻址方式

在这里插入图片描述
如上图所示,主要有四种寻址模式

  • 立即数寻址:操作数是位于指令自身的常数。

一般常数比较短,适用于16位字段,比如 lui 指令能将16位立即数常量存放到寄存器的高16位,低16位用0填充。但是, 如果想把32位常量加载到寄存器怎么办
首先,可以使用 lui 加载高16位,再用 ori 指令把低16位插入到寄存器。例子如下:
在这里插入图片描述
在这里插入图片描述

  • 寄存器寻址
  • 基址寻址或偏移寻址,其地址=基址寄存器的值+形式地址
  • PC相对寻址:地址=PC寄存器中的值+形式地址
  • 伪直接寻址:地址= PC中原高4位 + 指令中的26位 + 00 (32位地址)
为什么要用PC相对寻址:

首先,需要知道PC寄存器里放什么,PC寄存器里一般存放当前运行的指令地址(其实更应该叫指令地址寄存器),这个特点对条件分支很有利。
PC寄存器解决了分支指令地址大小的问题,原本条件分支地址最多16位字段,如下图,意味着任何程序不能大于2的16次方,用了PC相对寻址,既解决了地址过小问题,又由于PC包含当前指令地址,能满足条件分支跳转到附近指令的需求,故采用它是一个理想选择。

在这里插入图片描述

关于PC相对寻址:如何处理16位无法表达的远距离分支?

插入一个无条件跳转到分支目标地址的指令,把分支 指令中的条件变反以决定是否跳过该指令。

四、问题&&谬误(持续更新中)

  • MIPS指令 addiu 会对16位立即数域进行符号扩展

这听起来很怪, 因为 u 代表无符号数,这意味加法操作不会产生溢出异常,然而和 addi 、slti 、sltiu 指令类似,16位立即数字段要符号扩展为32位。

那么什么时候立即数被符号位扩展呢?
  • 算术指令 :add addi sub 总是将立即数做符号位扩展即便指令是无符号的;
    乘 、 除 指令 任何情况下都不进行扩展,总是当成 unsigned
  • 逻辑指令:(andi, ori通常处理无符号数)不对立即 数做符号位扩展
  • load / store指令: 地址计算时总是扩展立即数

总结

通过粗略的学习完这部分内容,我比较深切的感受是;
太神奇了吧!一门小小的“方言”竟然蕴含这么多巧思和独到设计思想,把原本迷雾一般的计算机硬件操作变得清晰可执行,真是万物皆可‘0101’啊!令人头大的0101的电信号跳跃变成可阅读的优美代码真是Amazing~
本人才疏学浅,目前只学到一点点皮毛,待后面进一步学习后再回来修改补充~

参考的其他写的非常好的文章:

https://blog.csdn.net/qq_41191281/article/details/85933985

  • 15
    点赞
  • 170
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
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指令译码器的设计需要考虑到各种可能的指令类型和操作数的组合,以确保译码器能够正确解析所有指令。同时,译码器还需要具有高效和快速的性能,以保证计算机的运行速度。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值