计算机组成原理--MIPS指令的表示和逻辑操作

Posted alanhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了计算机组成原理--MIPS指令的表示和逻辑操作相关的知识,希望对你有一定的参考价值。

计算机组成原理--10.5

1.计算机中指令的表示

前言

指令在计算机内部是用高低电平表示的,并且看上去和数的表示是一样的。实际上,指令的各个部分都可以看成数,将这些数拼在一起就构成了指令。(实际上指令和数据的存储确确实实是一样的--都是二进制数)

在接下来的学习中需要用的部分的寄存器,所以在这里先做简单引入。

寄存器$s0~$s7映射到寄存器16~23,寄存器$t0~$t7映射到寄存器8~15.(这里s和t都只是标号,在之后的学习中我们会知道,s代表保留寄存器,t代表临时寄存器)

指令格式

指令的布局形式叫做指令格式。

MIPS指令占32位,与数据字的位数相等。

数据字的定义:数据字,由于计算机使用的信息既有指令又有数据,所以计算机字可以代表指令,也可以代表数据。如果某字代表要处理的数据,则称为 数据字;如果某字为一条指令,则称为指令字-------百度百科

MIP字段

oprsrtrdshamtfunct
6位 5位 5位 5位 5位 6位
操作码 操作数寄存器1 操作数寄存器2 目的寄存器 位移量(之后介绍) 功能码

这是一种三地址指令,rd存放的是操作的结果。

问题:如果有些指令需要常数的参与,例如取数操作那该怎么做?

可能一开始想到的答案就是,把数放在rs,rt,rd段中,需要用常数的时候的时候,把他从去字段中取出。

但实际上,这种操作方法会出现问题,当参与操作的常数>32(2^5)时就会出现超出范围的问题。因此又希望所有指令的长度一样,又希望能够有统一的指令格式,同时还要避免出现操作的常数太小的问题.......就出现了心得指令格式:

I型指令

前面所介绍的指令类型叫做R型指令,即寄存器型指令,I型指令为用于立即数的指令

oprsrtconstant or adress
6位 5位 5位 16位
操作码 操作数寄存器1 操作数寄存器2 常数或者地址

例如:

1 lw $s0,32($s3)  #取字指令
2                         #$3存放在rs中,$0存放在rt中,32存放在address字段
3                         #此时rt的意义已经发生了变化
4                         #rt:指明接收取数结果的寄存器    

 

四种操作方式所对应的指令格式:

指令格式oprsrtrdshamtfunctaddress
add R 0 reg reg reg 0 32(10) n.a.
sub R 0 reg reg reg 0 34(10) n.a.
addi(立即数) I 8(10) reg reg n.a. n.a. n.a. constant
lw I 35(10) reg reg n.a. n.a. n.a. address

(reg代表使用寄存器,address代表16位地址,n.a.代表不出现)(add和sub的op是相同的,区分他们的是funct)

通过观察可以发现,R型和I型的前三个字段长度相等,并且名称也一样;I型格式的第四个字段和R型后三个字段长度之和相等。R型和I型虽然功能不同但是却构造很相似,而相关指令在二进制表示上的相似性可以简化硬件的设计。

 

补充:存储程序:将指令和数据以相同的方式存储,极大的简化了计算机系统。

1)指令用数的形式表达

2)和数一样程序存储在存储器中,并且可以读写

2.逻辑操作

逻辑左移与逻辑右移

之前在R型指令格式的介绍中,有一部分没有介绍--shamt字段(shift amount

shamt字段用来表示偏移量,经常用于逻辑左移(sll)和逻辑右移(srl)中。

逻辑左/右移:把一个字里所有的位都向左/右移动,并在空出的地方补0

sll $t2,$s0,4   #reg $t2 = reg $s0 << 4 bits
oprsrtrdshamtfunct
0 0 16 10 4 0

逻辑左移还有额外的好处,左移i位= 数 * 2^i

按位与(AND)和按位或(OR)

AND提供了一种将源操作数置零的方法。

1 假设$t1
2 0000 0000 0000 0000 0000 1101 1100 0000
3 and $t0,$t1,$t2 #如果想把$t1第一字节置为0,那么就可以让$t2中相应位置为0
4 t2
5 0000 0000 0000 0000 0000 1101 0000 0000
6 #$t2可以叫做掩码

与AND对偶的操作是按位或(OR)

OR提供了一种将源操作数置一的方法,与AND相似,不再详细展开。

按位取反(NOT)

该操作只有一个操作数,把这个操作数中的1->0,0->1

MIPS中还有或非NOR(NOT OR)

XOR

相同取1,不同取0

 

 

3.决策指令

条件分支指令

相等条件分支
beg $s0,$s1,L1

若$s0和$s1中数值相等,则转到标签为L1的语句

不相等条件分支
bne $s0,$s1,L1

若.......不相等,则转到标签为L1的语句

无条件分支指令

当遇到这种指令时,程序必须分支

j L1

当遇到这条指令,则转到标签为L1的语句

例:用机器语言表示C语言程序1

1 if( i == j )
2     f = g + h;
3 else
4     f = g - h;
1 #$s3=i,$s4=j
2 #$s0=g,$s1=h,$s2=f
3 bne $s3,$s4,Else        #若i!=j 则转到Else
4 add $s0,$s1,$s2         #若i==j 则到这一步 f=g+h
5 j Exit                  #i==j段运行结束
6 Else: sub $s0,$s1,$s2   #i!=j f=g+h
7 Exit:                   #程序结束

选择用bne而不是beg,因为bne通过测试分支的相反条件来体跳过if语句后边的then部分,提高效率

case/switch

使用转移地址表:由代码中标签所对应的地址构成的数组

程序跳转-------->(索引)------>转移地址表-------->(地址)-------->寄存器---------->(加载地址)-------->完成

为了支持这种情况,计算机提供了寄存器跳转指令jr(jump regisiter),用来无条件跳转到寄存器指定地址

(下下一节会详细介绍jr语句)

4.循环

LOOP标记循环

例:用机器语言表示C语言程序2

1 while( save[i] == k)
2     i=i+1;
1 $t3=i,$t5=k,$6=save
2 LOOP:   sll $t1,$s3,2       #存放i的寄存器左移2位
3         add $t1,$t1,$t6     #把偏移地址与基址相加
4         lw  $t0,0($t1)      #取出save[i]中的数
5         bne $t0,$s5,Exit    #save[i]!=k->Exit
6         addi $s3,$s3,1      #i++
7         j   LOOP            #回到LOOP标记,重新运行
8 Exit:

i原本代表的是第i个数组元素,而按字节寻址是一次寻找一个字节

但为什么要把i*4???

 

小于则置位(set on less than)slt

若第一个寄存器小于第二个寄存器,则第三个寄存器置1,否则置0

1 slt $s0,$s3,$s4     #$s0 = 1 if $s3 < $s4
2 slti $t0,$s2,10     #$s0 = 1 if $s2 < 10

比较指令应该具有分清有符号数和无符号数的能力

有符号数操作(slt,slti):最高位为1的数代表是一个复数,一定小于最高位为0

无符号数操作(sltu,sltiu):最高位为1,一定大于所有最高位为0的数

补充:边界检查的捷径

1 sltu $t0,$s1,$s2                #$t0=0 if $s1 >= length or $s1 < 0
2 beg  $t0,$zero,IndoexOutofBounds

 

 

 

 

以上是关于计算机组成原理--MIPS指令的表示和逻辑操作的主要内容,如果未能解决你的问题,请参考以下文章

计算机原理 5.5 MIPS指令概述

计算机组成原理组成原理(续4)

计算机组成原理指令系统

计算机组成原理——计算机的基本组成

计算机原理 6.13 单周期MIPS CPU

计算机组成原理——原理篇 处理器(上)