精华内容
下载资源
问答
  • MIPS指令集 .pdf

    2020-04-30 11:27:29
    MIPS指令的机器码字段信息,以及每种信息的汇编解析指令的操作方式,便于计算机工程师和IC设计工程师 在基于MIPS电路设计和程序设计的时候 进行参考
  • MIPS指令详解

    千次阅读 2021-04-17 17:25:31
    操作码,所有R型指令都全为0 rs 寄存器编号,对应第一个源操作数 rt 寄存器编号,对应第二个源操作数 rd 寄存器编号,保存结果 shamt 常数,在移位指令中使用 funct 功能码,指定指令的具体功能

    一.R型指令

    (1)R型指令格式

    000000 (op)RsRtRdshamtfunct
    6bits5bits5bits5bits5bits6bits

    注意: 该类型指令操作数和保存结果均通过寄存器进行。

    操作含义
    op操作码,所有R型指令都全为0
    rs寄存器编号,对应第一个源操作数
    rt寄存器编号,对应第二个源操作数
    rd寄存器编号,保存结果
    shamt常数,在移位指令中使用
    funct功能码,指定指令的具体功能

    (2)具体R型指令

    注意: R型指令根据操作的寄存器数可以分为三种不同类型。

    【1】带有3个寄存器

    指令[31 : 26][25 : 21][20 : 16][15 : 11][10 : 6][5 : 0]指令功能
    add000000rsrtrd00000100000寄存器加
    sub000000rsrtrd00000100010寄存器减
    and000000rsrtrd00000100100寄存器与
    or000000rsrtrd00000100101寄存器或
    xor000000rsrtrd00000100110寄存器异或

    $rd = $rs op $ rt

    【2】带有2个寄存器

    指令[31 : 26][25 : 21][20 : 16][15 : 11][10 : 6][5 : 0]指令功能
    sll00000000000rtrdsa100000逻辑左移
    srl00000000000rtrdsa000010逻辑右移
    sll00000000000rtrdsa000011算术右移

    $rd = $rt shift sa

    【3】带有1个寄存器

    指令[31 : 26][25 : 21][20 : 16][15 : 11][10 : 6][5 : 0]指令功能
    jr000000rs000000000000000001000寄存器跳转

    jr rs;
    PC = rs

    二.I型指令

    (1)I型指令格式

    OPRsRtimm(立即数)
    6bits5bits5bits16bits

    注意: 操作数中涉及立即数,结果保存到寄存器

    操作含义
    op标识指令的操作功能
    rs第一个源操作数,是寄存器操作数
    rt目的寄存器编号,用来保存运算结果
    imm第二个源操作数,立即数

    (2)具体I型指令

    注意: I型指令存在4种不同的类型

    【1】面向运算的I型指令

    指令[31 : 26][25 : 21][20 : 16][15 : 0]指令功能
    addi001000rsrtimm寄存器和立即数“加”
    andi001100rsrtimm寄存器和立即数“与”
    ori001101rsrtimm寄存器和立即数“或”
    xori001110rsrtimm寄存器和立即数“异或”

    第一条指令是对立即数进行符号拓展,其他都是0拓展
    addi rt, rs, imm;
    $rt = $rs op E(imm)

    【2】面向访存的I型指令

    指令[31 : 26][25 : 21][20 : 16][15 : 0]指令功能
    lw100011rsrtimm从存储器种读取数据
    sw101011rsrtimm把数据保存到存储器

    MIPS 32中唯一两条访问存储器的指令(RISC)
    lw rt, imm(rs) # r t = m e m [ rt = mem[ rt=mem[rs+E(imm)]
    sw rt, imm(rs) # m e m [ mem[ mem[rs+E(imm)] = $rt

    【3】面向数位设置的I型指令

    指令[31 : 26][25 : 21][20 : 16][15 : 0]指令功能
    lui00111100000rtimm设置寄存器的高16位

    lui rt, imm #$rt = imm<<16(空位补0)

    【4】面向条件转移(分支)的I型指令

    指令[31 : 26][25 : 21][20 : 16][15 : 0]指令功能
    beq000100rsrtimm寄存器相等则转移
    bne000101rsrtimm寄存器不相等则转移

    beq rs, rt, imm #if( r s = = rs== rs==rt) PC=PC+E(imm)<<2
    bne rs, rt, imm #if( r s ! = rs!= rs!=rt) PC=PC+E(imm)<<2
    标准的PC相对寻址方式

    三.J型指令

    (1)J型指令格式

    OP立即数
    6bits26bits

    (2)具体J型指令

    指令[31 : 26][25 : 0]指令功能
    j000010address无条件跳转
    jal001100address调用与联接

    j address;
    $ PC=($PC+4)H4U(address<<2)

    jal address;
    $ra = $PC+4(保存返回地址)
    $ PC=($PC+4)H4U(address<<2)

    四.举例

    (1)关于R型指令

    不同功能的R型指令使用的寄存器数量不一定相同,有一个、两个、三个

    所有R型指令的操作码OP字段均为000000

    R型指令既有算术运算指令,也有逻辑运算指令,它不支持访问主存的指令

    (2)关于J造型指令

    J型指令支持无条件跳转指令

    J性指令只使用伪直接寻址方式

    J型指令执行后,PC寄存器的值最后两位一定为00

    J型指令需要使用ra寄存器

    参考:华中科技大学mooc计算机组成原理

    展开全文
  • MIPS指令集及汇编

    千次阅读 多人点赞 2021-03-04 20:08:10
    MIPS指令集及汇编 由于本人最近在看底层操作系统与汇编的有关书籍,故写此博文总结,以便后续本人及感兴趣朋友阅读。如有错误恳请指出,一起学习,一起进步!   目录 MIPS指令集及汇编 一、MIPS简介: ...

    MIPS指令集及汇编


    由于本人最近在看底层操作系统与汇编的有关书籍,故写此博文总结,以便后续本人及感兴趣朋友阅读。如有错误恳请指出,一起学习,一起进步!

     

    目录

    MIPS指令集及汇编

    一、MIPS简介:

    二、MIPS体系结构

    1.寄存器特点:

    2.整数乘法单元和寄存器

    3.寻址方式

    4.存储器和寄存器中的数据类型

    三、MIPS指令与汇编

    1.指令格式

    2.寻址方式

    3.指令系统

    四、杂记(MIPS计算机硬件对函数调用(过程)的支持)

    1.为新数据分配空间

    2.MIPS 程序和数据的存储器空间使用约定


    一、MIPS简介:

    1.MIPS为美国芯片设计公司,它采用的是精简指令系统计算结构(RISC结构)(与之对应的:(复杂指令集)CISC结构)。MIPS架构的产品多见于工作站(索尼PS2的Emotion Engine处理器)。RISC比CISC的设计更加简单,由于其授权费用低,被INTEL外的大多数厂商使用。同时在设计理念上MIPS强调软硬件协同提高计算机性能,并简化硬件设计。

    2.MIPS 是最早的,最成功的RISC处理器之一,源于Stanford 大学的John Hennessy 教授的研究成果。(Hennessy 于1984年在硅谷创建了MIPS公司)。MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器。

    3.MIPS的指令系统经过通用处理器指令体系MIPS I、 MIPS II、MIPS III、MIPS IV到MIPS V,嵌入 式指令体系MIPS16、MIPS32到MIPS64的发展 已经十分成熟。应用广泛的32位MIPS CPU包括R2000,R3000 其ISA都是MIPS I,另一个广泛使用的、含有许多 重要改进的64位MIPS CPU R4000及其后续产 品,其ISA版本为MIPS III。龙芯2E微处理器是一款实现64位MIPSⅢ指令集的通用 RISC处理器,与X86指令架构互不兼容;芯片面积 6.8mm×5.2mm;最高工作频率为1GHz;实测功耗5-7瓦。由于与X86指令的不 兼容,龙芯2E无法运 行现有的Windows 32/64位操作系统, 和基于Windows的 众多应用软件。

    龙芯2E芯片

     

    二、MIPS体系结构

    1.寄存器特点:

    MIPS 包含32个通用寄存器 ($0-$31均为32 位), 硬件没有强制性的指定寄存器 使用规则,但是在实际使用 中,这些寄存器的用法都遵循 一系列约定,寄存器约定用法引入了一系列 的寄存器约定名。在使用寄存 器的时候,要尽量用这些约定名或助记符,而不直接引用寄 存器编号。

    (1)两个特殊寄存器:

    $0:不管你存放什么值,其返回值永远是零。

    $31:永远存放着正常函数调用指令(jal)的返回地址。

    (2)$at :

    由编译器生成的复合指令使用,

    (3)$v0, $v1: 

    用来存放一个子程序 (函数) 的非浮点 运算的结果或返回值。如果这两个寄存器不够存放 需要返回的值,编译器将会通过内存来完成。

    (4)$ a0-a3:

    用来传递子函数调用时前4个非 浮点参数。

    (5)$ t0-t9:

    依照约定,一个子函数可以不用保 存并随便的使用这些寄存器。在作表达式计算时,这些寄存器是非常好的暂时变量。当调用一个子函数时,这些寄存器中的 值有可能被子函数破坏掉。所以也是最不安全的。

    (6)$ s0-s8:

    依照约定,子函数必须保证当函数返回时这些寄存器的内 容必须恢复到函数调用以前的值, 或者在子函数里不用这些寄存器或把它们保存 在堆栈上并在函数退出时恢复。  这种约定使得这些寄存器非常适合作为寄存器变量、 或存放一些在函数调用期间必须保存的原来的值。(类比:x86汇编中的函数序言和函数尾声)

    (7)$ k0, k1:

    被OS的异常或中断处理程序使 用。被使用后将不会恢复原来的值。因此它 们很少在别的地方被使用。

    (8)$gp:

    如果存在一个全局指针,它将指向运行时决定 的静态数据(static data)区域的一个位置。这意味 着,利用gp作基指针,在gp指针32K左右的数 据存取,系统只需要一条指令就可完成。该指令如图:

    如果没有全局指针,存取一个静态数据区域 的值需要两条指令:一条是获取有编译器和loader决定好的32位的地 址常量。另外一条是对数据的真正存取。为了使用$ gp, 编译器在编译时刻必须知道 一个数据是否在$ gp的64K(上下32k)范围之内。并不是所有的编译和运行系统支持gp的使用。

    (9)$ sp:

    堆栈指针的上下需要显 式的通过指令来实现。因此 MIPS通常只在子函数进入和 退出的时刻才调整堆栈的指针。 这通过被调用的子函数来实现。SP通常被调整到这个被调用 的子函数需要的堆栈的最低的 地方,从而编译器可以通过相 对於sp的偏移量来存取堆栈上 的堆栈变量。

     

    (10)$ fp(另外的约定名是s8):

    fp作为框架指针可以被函数用来记录堆栈的情况,在一 个过程中变量相对于函数指针的偏移量是不变的。(相对地址)一些 编程语言显示的支持这一点。汇编编程员经常会利用fp的 这个用法。C语言的库函数 alloca()就是利用了fp来动态 调整堆栈的。

       

    注意:如果堆栈的底部 在编译时刻不能被决 定,你就不能通过$ sp 来存取堆栈变量,因此 $ fp被初始化为一个相 对于该函数堆栈的一个 常量的位置。 这种用法对其他函数可 以是不可见的。

    (11)$ ra:

    当调用任何一个子 函数时,返回地址存放 在ra寄存器中,因此通常 一个子程序的最后一个 指令是: jr ra     .子函数如果还要调用其 他的子函数,必须保存ra 的值,通常通过堆栈。

    (12)其他方面:

    MIPS里没有状态码。CPU状态寄存器或内 部都不包含任何用户程序计算的结果状态信息。

    hi  和  lo   是与乘法运算器相关的两个寄存器,是用来存放结果的地方。 它们并不是通用寄存器,除了用在乘除法之 外,也不能有做其他用途。 MIPS里定义了一些指令可以往hi和lo里存入任 何值。

    浮点运算协处理器 (浮点加速器,FPA),如果存在的 话,有32个浮点寄存器。按汇编语言的简单约定讲, 是从$f0到$f31。

    实际上,对於MIPS I和MIPS II的机器,只有16个偶数号的寄存器可以用来做数学计算。当然,它们可以既 用来做单精度(32位)和双精度(64位)。当你做一个双精度的运算时,寄存器$f1存放$f0的余数。奇数号的寄存器只用来作为寄存器与FPA之间的数据传送。MIPS III CPU有32个FP寄存器。但是为了保持软件与 过去的兼容性,最好不要用奇数号的寄存器。

    对比一下x86寄存器结构:

    寄存器约定小结:

    2.整数乘法单元和寄存器

    MIPS体系结构认为乘法非常重要,应该用硬件实现乘法指令,这在RISC CPU中并不常见。乘法结果寄存器是互锁的:只有在整数乘法 运算完成,得到完整的结果后,才能读取结 果寄存器。牺牲速度以换取执行简单和节省芯片空间。

    3.寻址方式

    只有加载或存储指令可以访问存储器。存储器的寻址方式为   基址-偏移寻址(存储单元的地址是某个寄存 器与指令中的偏移量之和)。

    4.存储器和寄存器中的数据类型

    MIPS CPU的一次操作可读出或写入1~8个字节的数据,*MIPS编译器提供了64位指针,它把long解释成64位数 据,总之long不应该小于int 。

     

    三、MIPS指令与汇编

    1.指令格式

    对于一条汇编语言指令来说,有两个问题要解决:

    • 要指出进行什么操作

    • 要指出大多数指令涉及的 操作数 和 操作结果 放在何处

     

    操作数

    在MIPS中字(4个字节)的地址必须是4的倍数,存取数据时可以避免一个数据分两次存取。

     

    MIPS有三种指令格式:(所有指令都是32 位长)

              

     

    (1)R-型 指令:

    一条32位的MIPS R型指令按下表bit数划分为 6个字段:6 + 5 + 5 + 5 + 5 + 6 = 32bit

              6                  5              5                 5                5                  6

    实例:       add   $8,  $17,  $18              #  $8 = $17 + $18 

    第一个操作数是寄存器$17,第二个寄存器是$18,目的寄存器结果是$8.该指令没有移位。因为,加法是运算指令,指令操作类型码op是0,funct是32。

    所以格式是:

            0

           $ 17  

             $18

           $ 8

             0

            32

    (2)I-型 指令

    一条32位的MIPS I型指令 按下表bit数划分为4 个字段: 6 + 5 + 5 + 1 6 = 32bit

                6                 5                5                                  16

    I-型指令分类:装入/存储指令、分支指令和 立即数运算指令

    数据装入:Rt = Mem[Rs + Address]

    数据存储:Mem[Rs + Address] = Rt

    实例:     lw    $s1,   100($s2)          # 暂时寄存器  $s1=A[i],并假设Astart= 100

    第一个操作数是寄存器 $s2 ,    第二个操作数是寄存器$s1 ;   数组的起始地址是Astart, 称为表头地址.

    所以这条指令的格式是:

           35 

           $s2      

             $s1

                             100

    分支指令:  if (Rs <relation> Rt)      goto     (PC+4) + Address     (PC 为程序计数器,指向当前执行的指令)

    分支指令采用的寻址方式为 PC相对寻址  ——分支 目标的地址是 (PC+4)(下一条指令的地址)与指令中的偏移量之和

    立即数运算指令  :   addi    $21,   $22,   -50 (立即数  可以为十进制)       # 将  $22 与 -50 相加 ,并将结果保存在 $21 中。

    所以这条指令的格式是:

           8 

           $22      

             $21

                             -50

    (3) J-型 指令: 

    一条32位的MIPS J型指令 按下表bit数划分为  2 个字段: 6 + 26 = 32bit

                6                                                         26

           操作码                                              目标地址

    2.寻址方式

    (1)寄存器寻址:MIPS算术运算指令的操作数必须从32个32位寄存器中选取

    实例:

    (2)立即数寻址:

    以常数作为操作数,无须访问存储器就可以使用常数。 因为常数操作数频繁出现,所以在算术指令中加入常数字段,比从存储器中读取常数快得多。

    实例:

    addi    $sp,   $sp,   4(常数)                 # $ sp =$ sp + 4

    小问题:怎么样将一个32 位的常数装入寄存器 $s0 中 呢???

    (分两次装入,先装入高16位,在装入低16 位) 如图:

    0000 0000 0011 1101(高16位)        0000 1001 0000 0000 (低16位)

                    61                                                       2304

    (3)基址或偏移寻址:

    操作数在存储器中,且存储器地址是某寄存器与指令中某常量的和。

    实例:

    Lw $t0,     8 ($ s0 )                 # $s0  中装的是存储器中的地址

    (4)PC相对寻址

    实例:

    条件分支指令     bne    $s0,    $s1,    Exit                     #如果  $s0不等于  $s1,则跳转到 Exit

    PC = PC + 分支地址

    问题1:为什么选PC寄存器?

    因为几乎所有的条件分支指令都是跳转到附近的地址。

    问题2:如何处理16位无法表达的远距离分支?

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

    (5)伪直接寻址:

    跳转地址= PC中原高4位 +  指令中的26位 +  00   (32位地址)

    寻址方式总览:

     

    3.指令系统

    (1)数据传送指令

    (2)算术/逻辑指令

    每条指令有且仅有3个操作数,且只执行一个操作

    R格式——ALU指令的格式

    Rs、Rt、Rd为寄存器编号

    Funct字段为指令功能代码

    乘法除法(multiply / divide)指令 演示图:

    算术指令总体概览图:

    无符号整数一般都是用来表示存储器地址 , 溢出即使发生,也大多数被忽略掉了,因此 MIPS采用了两种不同的算术运算指令来分别处理 。

    ( 1 ) addu, addiu, subu在发生溢出的时 候不产生异常 

    ( 2 )add, addi, sub在发生溢出时产生异常

    发生溢出的情况:

    加法:两正数相加结果为负,两负数相加结果为正

    减法:正数减负数结果为负,负数减正数结果为正

    MIPS在检测到溢出发生时会产生一个异常,造成溢出 指令的地址被存到一个特定寄存器中

    乘法:multu Hi不为 0 ,mult Hi各位不等于Lo符号位

    MIPS 乘 /除法指令都忽略了溢出的情况,程序必须自己 判断得到的积 /商是否超出了32位寄存器能表示的范围,还必须自己处理除零操作

    逻辑指令总体概览图:

    说明:

    MIPS的符号位扩展;

    那么什么时候立即数被符号位扩展呢?

    算术指令 总是将立即数做符号位扩展即便指令是无符号的!

    逻辑指令(andi, ori通常处理无符号数)不对立即 数做符号位扩展 (They are zero extended)

    load / store指令  地址计算时总是扩展立即数

    乘 / 除 指令 任何情况下都不进行扩展,总是当成 usigned

     

    addiu  在执行前也要将指令中的立即数进 行符号位扩展,因为:虽然U代表无符号 数,但是addiu事实上都被看作一条不会 发生溢出的add指令,因此常用它来加上 一个负的立即数。

    (3)控制类指令

    如果要实现其他比较功能,则需要两个以上的指令

    基本上都是与零比较(这个速度快)

    控制类指令概览:(跳转分支和比较指令)

    四、杂记(MIPS计算机硬件对函数调用(过程)的支持)

    1.为新数据分配空间

    利用堆栈去存储函数调用的过程中不适合用寄存器保存的局部变量(如局部数组或结构)。

    过程框架:也叫活动记录,是指包含了函数调用(过程)保存的寄存器和局部变量的堆栈段。下图给出了过程调用之前、之中和之后的堆栈状态。

    框架指针$fp指向框架的第一个字,通常是保存调用的参数寄存器。栈指针$sp指向栈顶,在程序执行的过程中栈指针有可能改变。因此通过固定的框架指针来访问变量要比用栈指针更简便。如果一个过程的栈中没有局部变量,编译器将不 设置和恢复框架指针,以节省时间(主要是通过 $fp 来访问局部变量)。当需要框架指针时,以调用时的$sp值作为框架 指针的初值,调用返回时,根据$fp恢复$sp值。

    2.MIPS 程序和数据的存储器空间使用约定

         

     从顶端开始,对栈指针初始化为 7fffffff,并向下向数据段增长; 在底端,程序代码(文本)开始于 00400000; 静态数据开始于10000000; 紧接着是由C中malloc进行存储器分 配的动态数据,朝堆栈段向上增长  。 

    全局指针被设定为易 于访问数据的地址, 以便使用相对于$gp 的±16位偏移量 0x1000 0000 -- 0x1000 ffff           

     在32位MIPS体系结构下,最多可寻址4GB地址空间。在4GB空间情况下内存地址空的分配如下图:

                       

    MIPS体系结构下,程序计数器(PC)不是一个寄存 器,在一个具有流水线的CPU中,程序计数器的值在一 个给定的时刻有多个可选值,但可见的只有一个。          

             

     

     

    至此,本文的长篇大论终于结束了,希望能够对阅读的朋友有些帮助。若有错误恳请指出,共同学习进步!欢迎有问题的朋友评论,一起交流讨论。

    展开全文
  • MIPS指令集 指令的格式

    千次阅读 2020-11-08 12:16:24
    MIPS指令集有三种指令格式:R型指令,I型指令,J型指令 MIPS处理器(MIPS CPU)中,具有存储功能的部件是寄存器,即CPU与内存的数据交换本质为寄存器与内存的数据交换。 MIPS处理器中的通用寄存器共3

    目录

    https://blog.csdn.net/weixin_45792450/article/details/109314693


    MIPS指令格式

    MIPS的指令是32位的,相当于一条指令的含义与操作细节完全由32个二进制数完全决定。对32位二进制数的不同划分使用,构成了不同的指令格式。

    MIPS指令集有三种指令格式:R型指令I型指令J型指令

    MIPS处理器(MIPS CPU)中,具有存储功能的部件是寄存器,即CPU内存的数据交换本质为寄存器内存的数据交换。

    MIPS处理器中的通用寄存器32个,依次从0到31编号,用$n表示n号寄存器。

    比如: $ 0 表 示 0 号 寄 存 器 \$0表示0号寄存器 $00

    为了表达方便,有些通用寄存器还有自己的名称,比如: 0 号 寄 存 器 $ 0 又 叫 $ z e r o 0号寄存器\$0又叫\$ zero 0$0$zero


    R型指令

    Op:指令操作码

    Rs:第一个源操作数寄存器号,参与运算使用

    Rt:第二个源操作数寄存器号,参与运算使用

    Rd:目的操作数寄存器号,保存结果使用

    Shamt:位偏移量,仅在位移指令使用,在此直接置0

    Func:指令函数码,用于选择Op操作中的具体函数

    比如加法运算,在指令操作码中,指出它是算术运算;在指令函数码中,指出它是算术运算中的加法运算。最后的运算即为: $ R d = $ R s + $ R t \$Rd=\$Rs+\$Rt $Rd=$Rs+$Rt

    I型指令

    Op:指令操作码

    Rs:第一个源操作数寄存器号,参与运算使用

    Rt:第二个源操作数寄存器号,参与运算使用

    16位立即数:作为数据,参与运算使用

    注:立即数,顾名思义,就是可以立即使用的数,即在指令中就给了具体的数据,而不用先给出寄存器号到寄存器中去找。

    J型指令

    Op:指令操作码

    26位地址数:作为地址,参与寻址使用

    通常用于指令的跳转使用,后面的数据用于提供跳转地址

    展开全文
  • MIPS指令集及汇编完全解析

    万次阅读 多人点赞 2019-01-07 17:48:14
    MIPS指令集及汇编 由于本人最近在看底层操作系统与汇编的有关书籍,故写此博文总结,以便后续本人及感兴趣朋友阅读。如有错误恳请指出,一起学习,一起进步!   目录 MIPS指令集及汇编 一、MIPS简介: 二、...

    MIPS指令集及汇编


    由于本人最近在看底层操作系统与汇编的有关书籍,故写此博文总结,以便后续本人及感兴趣朋友阅读。如有错误恳请指出,一起学习,一起进步!

     

    目录

    MIPS指令集及汇编

    一、MIPS简介:

    二、MIPS体系结构

    1.寄存器特点:

    2.整数乘法单元和寄存器

    3.寻址方式

    4.存储器和寄存器中的数据类型

    三、MIPS指令与汇编

    1.指令格式

    2.寻址方式

    3.指令系统

    四、杂记(MIPS计算机硬件对函数调用(过程)的支持)

    1.为新数据分配空间

    2.MIPS 程序和数据的存储器空间使用约定


    一、MIPS简介:

    1.MIPS为美国芯片设计公司,它采用的是精简指令系统计算结构(RISC结构)(与之对应的:(复杂指令集)CISC结构)。MIPS架构的产品多见于工作站(索尼PS2的Emotion Engine处理器)。RISC比CISC的设计更加简单,由于其授权费用低,被INTEL外的大多数厂商使用。同时在设计理念上MIPS强调软硬件协同提高计算机性能,并简化硬件设计。

    2.MIPS 是最早的,最成功的RISC处理器之一,源于Stanford 大学的John Hennessy 教授的研究成果。(Hennessy 于1984年在硅谷创建了MIPS公司)。MIPS是(Microcomputer without interlocked pipeline stages)的缩写,含义是无互锁流水级微处理器

    3.MIPS的指令系统经过通用处理器指令体系MIPS I、 MIPS II、MIPS III、MIPS IV到MIPS V,嵌入 式指令体系MIPS16、MIPS32到MIPS64的发展 已经十分成熟。应用广泛的32位MIPS CPU包括R2000,R3000 其ISA都是MIPS I,另一个广泛使用的、含有许多 重要改进的64位MIPS CPU R4000及其后续产 品,其ISA版本为MIPS III。龙芯2E微处理器是一款实现64位MIPSⅢ指令集的通用 RISC处理器,与X86指令架构互不兼容;芯片面积 6.8mm×5.2mm;最高工作频率为1GHz;实测功耗5-7瓦。由于与X86指令的不 兼容,龙芯2E无法运 行现有的Windows 32/64位操作系统, 和基于Windows的 众多应用软件。

    龙芯2E芯片

     

    二、MIPS体系结构

    1.寄存器特点:

    MIPS 包含32个通用寄存器 ($0-$31均为32 位), 硬件没有强制性的指定寄存器 使用规则,但是在实际使用 中,这些寄存器的用法都遵循 一系列约定,寄存器约定用法引入了一系列 的寄存器约定名。在使用寄存 器的时候,要尽量用这些约定名或助记符,而不直接引用寄 存器编号。

    (1)两个特殊寄存器:

    $0:不管你存放什么值,其返回值永远是零。

    $31:永远存放着正常函数调用指令(jal)的返回地址。

    (2)$at :

    由编译器生成的复合指令使用,

    (3)$v0, $v1: 

    用来存放一个子程序 (函数) 的非浮点 运算的结果或返回值。如果这两个寄存器不够存放 需要返回的值,编译器将会通过内存来完成。

    (4)$ a0-a3:

    用来传递子函数调用时前4个非 浮点参数。

    (5)$ t0-t9:

    依照约定,一个子函数可以不用保 存并随便的使用这些寄存器。在作表达式计算时,这些寄存器是非常好的暂时变量。当调用一个子函数时,这些寄存器中的 值有可能被子函数破坏掉。所以也是最不安全的。

    (6)$ s0-s8:

    依照约定,子函数必须保证当函数返回时这些寄存器的内 容必须恢复到函数调用以前的值, 或者在子函数里不用这些寄存器或把它们保存 在堆栈上并在函数退出时恢复。  这种约定使得这些寄存器非常适合作为寄存器变量、 或存放一些在函数调用期间必须保存的原来的值。(类比:x86汇编中的函数序言和函数尾声)

    (7)$ k0, k1:

    被OS的异常或中断处理程序使 用。被使用后将不会恢复原来的值。因此它 们很少在别的地方被使用。

    (8)$gp:

    如果存在一个全局指针,它将指向运行时决定 的静态数据(static data)区域的一个位置。这意味 着,利用gp作基指针,在gp指针32K左右的数 据存取,系统只需要一条指令就可完成。该指令如图:

    如果没有全局指针,存取一个静态数据区域 的值需要两条指令:一条是获取有编译器和loader决定好的32位的地 址常量。另外一条是对数据的真正存取。为了使用$ gp, 编译器在编译时刻必须知道 一个数据是否在$ gp的64K(上下32k)范围之内。并不是所有的编译和运行系统支持gp的使用。

    (9)$ sp:

    堆栈指针的上下需要显 式的通过指令来实现。因此 MIPS通常只在子函数进入和 退出的时刻才调整堆栈的指针。 这通过被调用的子函数来实现。SP通常被调整到这个被调用 的子函数需要的堆栈的最低的 地方,从而编译器可以通过相 对於sp的偏移量来存取堆栈上 的堆栈变量。

     

    (10)$ fp(另外的约定名是s8):

    fp作为框架指针可以被函数用来记录堆栈的情况,在一 个过程中变量相对于函数指针的偏移量是不变的。(相对地址)一些 编程语言显示的支持这一点。汇编编程员经常会利用fp的 这个用法。C语言的库函数 alloca()就是利用了fp来动态 调整堆栈的。

       

    注意:如果堆栈的底部 在编译时刻不能被决 定,你就不能通过$ sp 来存取堆栈变量,因此 $ fp被初始化为一个相 对于该函数堆栈的一个 常量的位置。 这种用法对其他函数可 以是不可见的。

    (11)$ ra:

    当调用任何一个子 函数时,返回地址存放 在ra寄存器中,因此通常 一个子程序的最后一个 指令是: jr ra     .子函数如果还要调用其 他的子函数,必须保存ra 的值,通常通过堆栈。

    (12)其他方面:

    MIPS里没有状态码。CPU状态寄存器或内 部都不包含任何用户程序计算的结果状态信息。

    hi  和  lo   是与乘法运算器相关的两个寄存器,是用来存放结果的地方。 它们并不是通用寄存器,除了用在乘除法之 外,也不能有做其他用途。 MIPS里定义了一些指令可以往hi和lo里存入任 何值。

    浮点运算协处理器 (浮点加速器,FPA),如果存在的 话,有32个浮点寄存器。按汇编语言的简单约定讲, 是从$f0到$f31。

    实际上,对於MIPS I和MIPS II的机器,只有16个偶数号的寄存器可以用来做数学计算。当然,它们可以既 用来做单精度(32位)和双精度(64位)。当你做一个双精度的运算时,寄存器$f1存放$f0的余数。奇数号的寄存器只用来作为寄存器与FPA之间的数据传送。MIPS III CPU有32个FP寄存器。但是为了保持软件与 过去的兼容性,最好不要用奇数号的寄存器。

    对比一下x86寄存器结构:

    寄存器约定小结:

    2.整数乘法单元和寄存器

    MIPS体系结构认为乘法非常重要,应该用硬件实现乘法指令,这在RISC CPU中并不常见。乘法结果寄存器是互锁的:只有在整数乘法 运算完成,得到完整的结果后,才能读取结 果寄存器。牺牲速度以换取执行简单和节省芯片空间。

    3.寻址方式

    只有加载或存储指令可以访问存储器。存储器的寻址方式为   基址-偏移寻址(存储单元的地址是某个寄存 器与指令中的偏移量之和)。

    4.存储器和寄存器中的数据类型

    MIPS CPU的一次操作可读出或写入1~8个字节的数据,*MIPS编译器提供了64位指针,它把long解释成64位数 据,总之long不应该小于int 。

     

    三、MIPS指令与汇编

    1.指令格式

    对于一条汇编语言指令来说,有两个问题要解决:

    • 要指出进行什么操作

    • 要指出大多数指令涉及的 操作数 和 操作结果 放在何处

     

    操作数

    在MIPS中字(4个字节)的地址必须是4的倍数,存取数据时可以避免一个数据分两次存取。

     

    MIPS有三种指令格式:(所有指令都是32 位长)

              

     

    (1)R-型 指令:

    一条32位的MIPS R型指令按下表bit数划分为 6个字段:6 + 5 + 5 + 5 + 5 + 6 = 32bit

              6                  5              5                 5                5                  6

    实例:       add   $8,  $17,  $18              #  $8 = $17 + $18 

    第一个操作数是寄存器$17,第二个寄存器是$18,目的寄存器结果是$8.该指令没有移位。因为,加法是运算指令,指令操作类型码op是0,funct是32。

    所以格式是:

            0

           $ 17  

             $18

           $ 8

             0

            32

    (2)I-型 指令

    一条32位的MIPS I型指令 按下表bit数划分为4 个字段: 6 + 5 + 5 + 1 6 = 32bit

                6                 5                5                                  16

    I-型指令分类:装入/存储指令、分支指令和 立即数运算指令

    数据装入:Rt = Mem[Rs + Address]

    数据存储:Mem[Rs + Address] = Rt

    实例:     lw    $s1,   100($s2)          # 暂时寄存器  $s1=A[i],并假设Astart= 100

    第一个操作数是寄存器 $s2 ,    第二个操作数是寄存器$s1 ;   数组的起始地址是Astart, 称为表头地址.

    所以这条指令的格式是:

           35 

           $s2      

             $s1

                             100

    分支指令:  if (Rs <relation> Rt)      goto     (PC+4) + Address     (PC 为程序计数器,指向当前执行的指令)

    分支指令采用的寻址方式为 PC相对寻址  ——分支 目标的地址是 (PC+4)(下一条指令的地址)与指令中的偏移量之和

    立即数运算指令  :   addi    $21,   $22,   -50 (立即数  可以为十进制)       # 将  $22 与 -50 相加 ,并将结果保存在 $21 中。

    所以这条指令的格式是:

           8 

           $22      

             $21

                             -50

    (3) J-型 指令: 

    一条32位的MIPS J型指令 按下表bit数划分为  2 个字段: 6 + 26 = 32bit

                6                                                         26

           操作码                                              目标地址

    2.寻址方式

    (1)寄存器寻址:MIPS算术运算指令的操作数必须从32个32位寄存器中选取

    实例:

    (2)立即数寻址:

    以常数作为操作数,无须访问存储器就可以使用常数。 因为常数操作数频繁出现,所以在算术指令中加入常数字段,比从存储器中读取常数快得多。

    实例:

    addi    $sp,   $sp,   4(常数)                 # $ sp =$ sp + 4

    小问题:怎么样将一个32 位的常数装入寄存器 $s0 中 呢???

    (分两次装入,先装入高16位,在装入低16 位) 如图:

    0000 0000 0011 1101(高16位)        0000 1001 0000 0000 (低16位)

                    61                                                       2304

    (3)基址或偏移寻址:

    操作数在存储器中,且存储器地址是某寄存器与指令中某常量的和。

    实例:

    Lw $t0,     8 ($ s0 )                 # $s0  中装的是存储器中的地址

    (4)PC相对寻址

    实例:

    条件分支指令     bne    $s0,    $s1,    Exit                     #如果  $s0不等于  $s1,则跳转到 Exit

    PC = PC + 分支地址

    问题1:为什么选PC寄存器?

    因为几乎所有的条件分支指令都是跳转到附近的地址。

    问题2:如何处理16位无法表达的远距离分支?

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

    (5)伪直接寻址:

    跳转地址= PC中原高4位 +  指令中的26位 +  00   (32位地址)

    寻址方式总览:

     

    3.指令系统

    (1)数据传送指令

    (2)算术/逻辑指令

    每条指令有且仅有3个操作数,且只执行一个操作

    R格式——ALU指令的格式

    Rs、Rt、Rd为寄存器编号

    Funct字段为指令功能代码

    乘法除法(multiply / divide)指令 演示图:

    算术指令总体概览图:

    无符号整数一般都是用来表示存储器地址 , 溢出即使发生,也大多数被忽略掉了,因此 MIPS采用了两种不同的算术运算指令来分别处理 。

    ( 1 ) addu, addiu, subu在发生溢出的时 候不产生异常 

    ( 2 )add, addi, sub在发生溢出时产生异常

    发生溢出的情况:

    加法:两正数相加结果为负,两负数相加结果为正

    减法:正数减负数结果为负,负数减正数结果为正

    MIPS在检测到溢出发生时会产生一个异常,造成溢出 指令的地址被存到一个特定寄存器中

    乘法:multu Hi不为 0 ,mult Hi各位不等于Lo符号位

    MIPS 乘 /除法指令都忽略了溢出的情况,程序必须自己 判断得到的积 /商是否超出了32位寄存器能表示的范围,还必须自己处理除零操作

    逻辑指令总体概览图:

    说明:

    MIPS的符号位扩展;

    那么什么时候立即数被符号位扩展呢?

    算术指令 总是将立即数做符号位扩展即便指令是无符号的!

    逻辑指令(andi, ori通常处理无符号数)不对立即 数做符号位扩展 (They are zero extended)

    load / store指令  地址计算时总是扩展立即数

    乘 / 除 指令 任何情况下都不进行扩展,总是当成 usigned

     

    addiu  在执行前也要将指令中的立即数进 行符号位扩展,因为:虽然U代表无符号 数,但是addiu事实上都被看作一条不会 发生溢出的add指令,因此常用它来加上 一个负的立即数。

    (3)控制类指令

    如果要实现其他比较功能,则需要两个以上的指令

    基本上都是与零比较(这个速度快)

    控制类指令概览:(跳转分支和比较指令)

    四、杂记(MIPS计算机硬件对函数调用(过程)的支持)

    1.为新数据分配空间

    利用堆栈去存储函数调用的过程中不适合用寄存器保存的局部变量(如局部数组或结构)。

    过程框架:也叫活动记录,是指包含了函数调用(过程)保存的寄存器和局部变量的堆栈段。下图给出了过程调用之前、之中和之后的堆栈状态。

    框架指针$fp指向框架的第一个字,通常是保存调用的参数寄存器。栈指针$sp指向栈顶,在程序执行的过程中栈指针有可能改变。因此通过固定的框架指针来访问变量要比用栈指针更简便。如果一个过程的栈中没有局部变量,编译器将不 设置和恢复框架指针,以节省时间(主要是通过 $fp 来访问局部变量)。当需要框架指针时,以调用时的$sp值作为框架 指针的初值,调用返回时,根据$fp恢复$sp值。

    2.MIPS 程序和数据的存储器空间使用约定

         

     从顶端开始,对栈指针初始化为 7fffffff,并向下向数据段增长; 在底端,程序代码(文本)开始于 00400000; 静态数据开始于10000000; 紧接着是由C中malloc进行存储器分 配的动态数据,朝堆栈段向上增长  。 

    全局指针被设定为易 于访问数据的地址, 以便使用相对于$gp 的±16位偏移量 0x1000 0000 -- 0x1000 ffff           

     在32位MIPS体系结构下,最多可寻址4GB地址空间。在4GB空间情况下内存地址空的分配如下图:

                       

    MIPS体系结构下,程序计数器(PC)不是一个寄存 器,在一个具有流水线的CPU中,程序计数器的值在一 个给定的时刻有多个可选值,但可见的只有一个。          

             

     

     

    至此,本文的长篇大论终于结束了,希望能够对阅读的朋友有些帮助。若有错误恳请指出,共同学习进步!欢迎有问题的朋友评论,一起交流讨论。

    展开全文
  • 处理器实现了MIPS R2000指令集体系结构的子集。 格式 R型 31-26 25-21 20-16 15-11 10-6 5-0 操作码 rs rt rd 破烂 功能 I型 31-26 25-21 20-16 15-0 操作码 rs rt 嗯 J型 31-26 25-0 操作码 嗯 ...
  • MIPS指令集

    千次阅读 2017-02-05 12:26:39
    MIPS指令集 MIPS指令集属于精简指令集 MIPS的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。 简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大 MIPS有32个通用...
  • MIPS 指令集(共31条)

    万次阅读 多人点赞 2018-08-31 15:22:24
    MIPS 指令集(共31条) MIPS 指令集(共31条) 助记符 指令格式 示例 ...
  • MIPS指令集 寻址的方式

    千次阅读 2020-11-09 08:57:13
    一般来讲,程序由数据和指令构成,指令指导操作,数据提供操作对象,指令和数据在运行时都是存在内存中的,对它们的寻址需要特定的方法。 寻址方式分为指令寻址和数据寻址。对指令地址的寻找称为指令寻址,对数据...
  • MIPS32指令集架构简介

    千次阅读 2020-12-09 21:47:51
    1.4 MIPS32指令集架构简介 本书设计的处理器遵循MIPS32 Release 1架构,所以本节介绍的MIPS32指令集架构指的就是MIPS32 Release 1。 1.4.1 数据类型 指令的主要任务就是对操作数进行运算,操作数有不同的类型和...
  • 基于MIPS指令集的单周期处理器设计 一、项目概述 设计题目 设数组存有8个任意字符,将其按顺序拼接得到一个双字(64位),对此双字进行循环左移4位。计算新得到的8个字符中,每个字符中1的个数,并对应存储成新的...
  • MIPS汇编指令集

    万次阅读 多人点赞 2016-03-30 16:55:37
    MIPS汇编MIPS指令集 MIPS指令集属于精简指令集 MIPS的所有指令都是32位,指令格式简单,而X86的指令长度不是固定的。 简单的指令和格式易于译码和流水线操作,但是代码密度不高,导致二进制文件大 ...
  • 掌握RISC CPU与内存数据交换的方法,使用verilog设计一个多周期cpu,根据所给的mips指令集来实现 以数字电路为基础,设计基础组件 以组成原理为基础,各组件为原料,构造Minisys-1 CPU 能够使用vivado等软件通过...
  • MIPS指令集与简要分析

    2019-03-01 19:59:23
    最近接触MIPS,学习指令系统,感觉这篇总结的比较简洁,适合初学 https://www.jianshu.com/p/ac2c9e7b1d8f
  • t9:临时变量立即数主存单元指令集与汇编程序主存变量声明读存储器lb & lbulh & lhulw写寄存器lui算术运算add,sub,addu,subu,addimulti,multu,div,divu ; mfhi,mflo,mthi,mtlo逻辑运算and,andi,or,...
  • 计算机指令就是指挥机器工作的指示和命令,程序就是一系列按一定顺序排列的指令...在第2章时我们介绍了MIPS所有指令都是32位的,操作码占用高6位(bit31-bit26)表示,低26位按格式划分为R型、I型和J型。本章将按mip...
  • 指令分析是第一步:MIPS指令集一共有三种指令。 R型(寄存器型):由Op(6位,下同)操作码,Rs(5),Rt(5),Rd(5),shamt(5)移位位,func(6)功能码组成 I型(立即数型):由Op(6),Rs(5),Rt(5),imm16(16)16位立即...
  • 拆炸弹实验-为VMware-虚拟机配置mips指令集环境 学习计算机系统的时候,我们逃离不了实验的折磨,尤其是拆炸弹实验,做这个实验的时候,我们往往需要在学校的实验平台上做,但是实验学时有限,很多同学可能做不完,...
  • MIPS指令集是计算机应用中最简单的指令集,弄懂MIPS指令集,可以帮助我们更好的理解计算机的运行原理。 本文大量参考《计算机组成与设计 硬件/软件接口》这本书(提取为:os0a),如果你看完觉得不过瘾,可以下载...
  • MIPS指令编码

    千次阅读 2014-07-03 11:50:00
    opcode: primary oprtation code 操作码 rd: destination register 目的寄存器 rs: source register 源寄存器 rt:target(src/dst) register 目标寄存器,或者是给特殊功能用(REGIMM) immediate: 立即数...
  • 精简指令集MIPS为例)常用指令特点及其格式 一、指令集 指令集是指一台计算机的全部指令;不同的计算机有不同的指令集,但是在许多方面都有共同之处。早期的计算机有非常简单的指令集:实现简单,许多现代计算机也...
  • MIPS指令简介

    千次阅读 2020-01-22 10:08:50
    在这一节,我们就将来分析MIPS指令的特点。 相比于X86指令所提供的动辄上千页的指令说明,MIPS指令只用这两页纸就可以说清楚了。 MIPS指令的基本格式就分为这三种:R型,I型和J型。 R型指的是寄存器型; I型指的是...
  • MIPS指令与MIPS汇编语言

    千次阅读 2020-09-02 11:18:04
    MIPS采用的是精简指令系统计算结构(RISC结构)(与之对应的:(复杂指令集)CISC结构)。RISC比CISC的设计更加简单,由于其授权费用低,被INTEL外的大多数厂商使用。同时在设计理念上MIPS强调软硬件协同提高计算机...
  • mips指令分类和寻址大全

    万次阅读 多人点赞 2018-01-08 20:16:42
    指令集:一个给定的计算机体系结构所包含的指令集合。存储程序概念:多种类型的指令和数据均以数字形式存储于存储器的概念,存储程序型计算机即缘于此。1 二、MIPS操作数之32个寄存器 寄存器名字 ...
  • 指令的操作十分简单,其操作由操作码编码表示。 每个操作需要的操作数个数为 0-3 个不等。 操作数是一些存储单元的地址; 典型的存储单元通常有:主存、寄存器、堆栈和累加器。 操作数地址隐含表示或显式表示。 ...
  • 计算机组成原理(4.3)—— MIPS指令系统(RSIC)

    千次阅读 多人点赞 2020-08-16 22:03:24
    前一篇文章分析了指令系统(ISA)的设计方法,这里以MIPS指令系统为例进行分析 前文链接:计算机组成原理(4.1)—— 指令系统设计 文章目录一、MIPS架构基础1. 寄存器数据指定(1)MIPS架构中的寄存器安排(2)...
  • MIPS32指令集

    千次阅读 2015-03-12 15:16:27
    MIPS32指令集 MIPS指令可以分成以下各类:  空操作no-op;  寄存器/寄存器传输:用得很广,包括条件传输在内;  常数加载:作为数值和地址的整型立即数;  算术/逻辑指令;  整数乘法、除法和求余数;  整数...
  • 基于上节课的7条MIPS指令的数据通路,分别针对7条MIPS指令设计控制信号,接着是时序设计;依此绘制了控制信号表,接着即可进行电路设计的实现。
  • 所谓指令集,指的就是计算机的全部指令,这章节将以MIPS指令集作为学习对象,如果是x86指令集,还请参考《深入理解计算机系统》。MIPS指令集在嵌入式芯片市场占有相当大的市场份额,应用在包括用户电子,网络/存储...
  • 如何获取MIPS汇编对应的机器

    千次阅读 2020-04-20 17:24:45
    在看《自己动手写CPU》的时候,里面需要将MIPS转换成机器作为输入的指令,不过书上的工具以及一些步骤在实际中是不能用的,因此在这里将“从MIPS汇编转换成机器”的完整过程下来 安装Linux虚拟机 因为汇编工具...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,327
精华内容 1,330
关键字:

mips指令集操作码