计算机组成原理——指令分析

本文详细解读了MIPS指令的load/store、算术运算、逻辑运算和控制转移部分,通过实例演示了LW、SW、DADD、AND等指令的使用,以及程序执行流程分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 实验目的:

结合附件A MIPSsim指令列表,完成下列程序中指令的功能解释,理解程序的执行过程

  • 实验原理:

MIPS 指令可以分为 4 大类:load 和 store、ALU 操作、分支与跳转、浮点操作。

三、实验内容:

Alltest

# load和store指令

.text

main:

ADDIU $r8, $r0, DATA    //将r0和立即数DATA相加存入r8。32位按无符号数操作

LB $r1, 0($r8)           //取字节,在r8寄存器中的对应地址中读出一个字节,经零扩展后,存到r1寄存器中,按有符号数操作

LW $r1, 0($r8)           //取r8寄存器中的字加上16位偏移量存到r1寄存器中

LBU $r1, 0($r8)          //在r8寄存器中的对应地址中,经零扩展后,存到r1寄存器

ADDIU $r8, $r0, BUFFER   //将r0和立即数BUFFER相加存入r8。32位按无符号数操作

SW $r1,0($r8)           //从r1中读取数据按16位偏移量offset 写入寄存器r8

BEQ $r0, $r0, PROG2     //若寄存器r0和寄存器r0的值相等,则转到PROG2语句执行

NOP                   //空操作指令,用于控制时间周期

# 算术运算指令

PROG2:

DADD $r3, $r1, $r2       //双字寄存器加,r1加r2存入r3,按有符号数操作

DMULT $r1, $r2          //双字寄存器乘,,r1乘r2的值,积的低 64 位送 LO, 高 64 位送 HI,按有符号数操作

BEQ $r0, $r0, PROG3     //若寄存器r0和寄存器r0的值相等,则转到PROG3语句执行

NOP                   //空操作指令

# 逻辑运算指令

PROG3:

AND $r3, $r1, $r2        //r1和r2进行与运算,将结果存入r3

ANDI $r3, $r1,0xFFFF0000

BEQ $r0, $r0, PROG4     //若寄存器r0和寄存器r0的值相等,则转到PROG4语句执行

NOP                   //空操作指令

# 控制转移指令  

PROG4:

BEQ $r1,$r2,LABEL1      //若寄存器r1和寄存器r2的值相等,则转到LABLE1语句执行

NOP                   //空操作指令

NOP                   //空操作指令

LABEL1:

BGEZ $r1,LABEL2        //若r1大于等于0,则跳转LABEL2       

NOP                   //空操作指令

NOP                   //空操作指令

LABEL2:

BGEZAL $r1,LABEL3      //若r1大于等于0转移并链接LABEL3,并将返回

地址(当前的 PC 值)保存到 R31

NOP                   //空操作指令

NOP                   //空操作指令

LABEL3:

ADDIU $r1, $r0, LABEL4   //r0加立即数LABEL4存入r1,32 位,按无符号数操作

JALR $r3, $r1            //无条件转移到 r1给出的地址,并将返回地址 PC+4 保存到 r3

NOP                   //空操作指令

NOP                   //空操作指令

LABEL4:

TEQ $r0, $r0            //如果r0=r0,则自陷

NOP                   //空操作指令

# 数据

.data        //随后定义的数据被存放到数据段

.align 2      // 将下一个数据对准字边界

DATA:

.word 128   //在连续的内存区中存储值为 wl,w2, …, 的 128 个字(32

位)的数

BUFFER:

.word 300   //在连续的内存区中存储值为 wl,w2, …, 的300个字(32

位)的数

pipeline

.text

main:

ADDIU $r8,$r0,num    //将r0和立即数num相加存入r8。32位按无符号数操作

LW $r1, 0($r8)        //取r8寄存器中的字加上16位偏移量存到r1寄存器中

      

BGEZAL $r1,func    //如果r1大于等于0,则执行func,并将返回地址(当前的 PC 值)保存到 R31

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

SW $r2, 60($r0)     //从r2中读取数据按16位偏移量offset 写入寄存器r0

TEQ $r0,$r0        //如果r0=r0,则自陷

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

func:

ADD $r2,$r1,$r0    //寄存器r1加r0,并将其存入r2

ADDI $r6,$r0,8     //寄存器r0加立即数8,并将其存入r6

loop:

ADDI $r1,$r1,-1     //寄存器r1加立即数-1,并将其存入r1

ADDI $r3,$r0,25     //寄存器r0加立即数25,并将其存入r3

LW  $r4, 60($r6)    //取r6寄存器中的字加上16位偏移量存到r4寄存器中

BEQ $r1,$r0,ret     //若寄存器r1和寄存器r0的值相等,则执行ret跳转指令

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

MUL $r2,$r1,$r2      //寄存器r1乘r2,并将其存入r2

BEQ $r0,$r0,loop     //若寄存器r0和寄存器r0的值相等,则执行loop循环指令

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

ret:

JR $r31            //寄存器r31跳转到PC

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

.data

num: .word 5      //在连续的内存区中存储值为 w0, …,w5 的 5个字(32 位)的数

schedule

.text

main:

ADDIU  $r1,$r0,A    //将r0和立即数A相加存入r1。32位按无符号数操作

LW     $r2,0($r1)    //取r1寄存器中的字加上16位偏移量存到r2寄存器中

ADD    $r4,$r0,$r2         //寄存器r2加r0,并将其存入r4

SW     $r4,0($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r4

LW     $r6,4($r1)          //取r1寄存器中的字加上16位偏移量存到r6寄存器中

ADD    $r8,$r6,$r1         //寄存器r1加r6,并将其存入r8

MUL    $r12,$r10,$r1          //寄存器r10乘r1,并将其存入r12

ADD    $r16,$r12,$r1          //寄存器r1加r12,并将其存入r16

ADD    $r18,$r16,$r1          //寄存器r1加r16,并将其存入r18

SW     $r18,16($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r18

LW     $r20,8($r1)           //取r1寄存器中的字加上16位偏移量存到r20寄存器中

MUL    $r22,$r20,$r14       //寄存器r14乘r20,并将其存入r22

MUL    $r24,$r26,$r14       //寄存器r14乘r26,并将其存入r24

TEQ $r0,$r0                 //如果r0=r0,则自陷

.data                       //随后定义的数据被存放到数据段

A:

.word 4,6,8                  //在连续的内存区中存储值为 w4 …,w8 的 8 个字(32 位)的数

afer-schedule

.text

main:

ADDIU  $r1,$r0,A            //将r0和立即数A相加存入r1。32位按无符号数操作

ADD    $r4,$r0,$r2          //寄存器r0加r2,并将其存入r4

LW     $r2,0($r1)           //取r1寄存器中的字加上16位偏移量存到r2寄存器中

SW     $r4,0($r1)           //从r1中读取数据按16位偏移量offset 写入寄存器r4

LW     $r6,4($r1)           //取r1寄存器中的字加上16位偏移量存到r6寄存器中

MUL    $r12,$r10,$r1       //寄存器r1乘r10,并将其存入r12

ADD    $r8,$r6,$r1          //寄存器r1加r6,并将其存入r8

ADD    $r16,$r12,$r1        //寄存器r1加r12,并将其存入r16

LW     $r20,8($r1)          //取r1寄存器中的字加上16位偏移量存到r20寄存器中

ADD    $r18,$r16,$r1        //寄存器r1加r16,并将其存入r18

SW     $r18,16($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r18

MUL    $r22,$r20,$r14        //寄存器r20乘r14,并将其存入r22

MUL    $r24,$r26,$r14        //寄存器r14乘r26,并将其存入r24

TEQ $r0,$r0                  //如果r0=r0,则自陷

.data

A:

.word 4,6,8                  //在连续的内存区中存储值为 w4, …,w8 的 8 个字(32 位)的数

Branch

.text

main:

ADDI  $r2,$r0,1024        //寄存器r0加立即数1024,并将其存入r2

ADD   $r3,$r0,$r0         //寄存器r3加r0,并将其存入r2

ADDI  $r4,$r0,8           //寄存器r0加立即数8,并将其存入r4

loop: 

LW    $r1,0($r2)           //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADDI  $r1,$r1,1           //寄存器r1加立即数1,并将其存入r1

SW    $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

ADDI  $r3,$r3,4           //寄存器r3加立即数4,并将其存入r3

SUB   $r5,$r4,$r3         //寄存器r3减r4,并将其存入r5

BGTZ  $r5,loop           //若r5大于0,则执行loop

ADD   $r7,$r0,$r6         //寄存器r6加r0,并将其存入r7

TEQ   $r0,$r0            //如果r0=r0,则自陷

delayed-branch

.text

main:

ADDI  $r2,$r0,1024         //寄存器r0加立即数1024,并将其存入r2

ADD   $r3,$r0,$r0          //寄存器r3加r0,并将其存入r0

ADDI  $r4,$r0,8            //寄存器r0加立即数8,并将其存入r4

loop: 

LW    $r1,0($r2)           //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADDI  $r3,$r3,4           //寄存器r3加立即数4,并将其存入r3

ADDI  $r1,$r1,1           //寄存器r1加立即数1,并将其存入r1

SUB   $r5,$r4,$r3         //寄存器r4减r3,并将其存入r5

SW    $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

BGTZ  $r5,loop           //若r5大于0,则执行loop

ADD   $r7,$r0,$r6         //寄存器r6加r0,并将其存入r7

TEQ   $r0,$r0            //如果r0=r0,则自陷

data_hz

.text

main:

ADDIU $r2,$r0,A       //将r0和立即数A相加存入r2。32位按无符号数操作

ADDIU $r3,$r0,B       //将r0和立即数B相加存入r3。32位按无符号数操作

loop:

LW $r1,0($r2)          //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADD $r1,$r1,$r3        //寄存器r3加r1,并将其存入r1

SW $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

LW $r5,0($r1)          //取r1寄存器中的字加上16位偏移量存到r5寄存器中

ADDI $r5,$r5,10        //寄存器r5加立即数10,并将其存入r5

ADDI $r2,$r2,4         //寄存器r2加立即数4,并将其存入r2

SUB $r4,$r3,$r2        //寄存器r3减r2,并将其存入r4

BGTZ $r4,loop         //若r4大于0,则执行loop

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

TEQ $r0,$r0           //如果r0=r0,则自陷

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

.data

A: .word 0, 4, 8                  //在连续的内存区中存储值为 w0,w1, …w4 的 8 个字(32 位)的数

B: .word 2, 1, 0                  //在连续的内存区中存储值为 w2,w1的 0个字(32 位)的数

structure_hz

.text

main:

ADD.D $f2,$f0,$f1         //双精度浮点f0加f1,并将其存入f2

ADD.D $f3,$f0,$f1         //双精度浮点f0加f1,并将其存入f3

ADD.D $f4,$f0,$f1         //双精度浮点f0加f1,并将其存入f4

ADD.D $f5,$f0,$f1         //双精度浮点f0加f1,并将其存入f5

ADD.D $f6,$f0,$f1         //双精度浮点f0加f1,并将其存入f6

ADD.D $f7,$f0,$f1         //双精度浮点f0加f1,并将其存入f7

ADD.D $f8,$f0,$f1         //双精度浮点f0加f1,并将其存入f8

ADD.D $f9,$f0,$f1         //双精度浮点f0加f1,并将其存入f9

TEQ $r0,$r0              //如果r0=r0,则自陷

  • 实验分析:

  

五、实验总结:

通过这次实验我知道了load和store指令的具体例子。LW是装入字,SW是保存字,ALU指令,都是寄存器-寄存器型(RR 型)或立即数型的。DADDU是无符号加,DADDIU是无符号立即加。控制指令的跳转和分支指令。JR是寄存器跳转,BEQZ是等于零时分支。算术运算指令:寄存器加(ADD),立即值加 (ADDI),无符号立即值加(ADDIU),寄存器乘(MUL)。逻辑运算指令与(AND)。CPU 移位指令:按立即值逻辑左移(SLL),分支指令:相等转移BEQ,大于0转移(BGTZ)。跳转指令:寄存器跳转(JR)。自陷指令:等于自陷(TEQ)等。

​​​​​​​

  • 实验目的:

结合附件A MIPSsim指令列表,完成下列程序中指令的功能解释,理解程序的执行过程

  • 实验原理:

MIPS 指令可以分为 4 大类:load 和 store、ALU 操作、分支与跳转、浮点操作。

三、实验内容:

Alltest

# load和store指令

.text

main:

ADDIU $r8, $r0, DATA    //将r0和立即数DATA相加存入r8。32位按无符号数操作

LB $r1, 0($r8)           //取字节,在r8寄存器中的对应地址中读出一个字节,经零扩展后,存到r1寄存器中,按有符号数操作

LW $r1, 0($r8)           //取r8寄存器中的字加上16位偏移量存到r1寄存器中

LBU $r1, 0($r8)          //在r8寄存器中的对应地址中,经零扩展后,存到r1寄存器

ADDIU $r8, $r0, BUFFER   //将r0和立即数BUFFER相加存入r8。32位按无符号数操作

SW $r1,0($r8)           //从r1中读取数据按16位偏移量offset 写入寄存器r8

BEQ $r0, $r0, PROG2     //若寄存器r0和寄存器r0的值相等,则转到PROG2语句执行

NOP                   //空操作指令,用于控制时间周期

# 算术运算指令

PROG2:

DADD $r3, $r1, $r2       //双字寄存器加,r1加r2存入r3,按有符号数操作

DMULT $r1, $r2          //双字寄存器乘,,r1乘r2的值,积的低 64 位送 LO, 高 64 位送 HI,按有符号数操作

BEQ $r0, $r0, PROG3     //若寄存器r0和寄存器r0的值相等,则转到PROG3语句执行

NOP                   //空操作指令

# 逻辑运算指令

PROG3:

AND $r3, $r1, $r2        //r1和r2进行与运算,将结果存入r3

ANDI $r3, $r1,0xFFFF0000

BEQ $r0, $r0, PROG4     //若寄存器r0和寄存器r0的值相等,则转到PROG4语句执行

NOP                   //空操作指令

# 控制转移指令  

PROG4:

BEQ $r1,$r2,LABEL1      //若寄存器r1和寄存器r2的值相等,则转到LABLE1语句执行

NOP                   //空操作指令

NOP                   //空操作指令

LABEL1:

BGEZ $r1,LABEL2        //若r1大于等于0,则跳转LABEL2       

NOP                   //空操作指令

NOP                   //空操作指令

LABEL2:

BGEZAL $r1,LABEL3      //若r1大于等于0转移并链接LABEL3,并将返回

地址(当前的 PC 值)保存到 R31

NOP                   //空操作指令

NOP                   //空操作指令

LABEL3:

ADDIU $r1, $r0, LABEL4   //r0加立即数LABEL4存入r1,32 位,按无符号数操作

JALR $r3, $r1            //无条件转移到 r1给出的地址,并将返回地址 PC+4 保存到 r3

NOP                   //空操作指令

NOP                   //空操作指令

LABEL4:

TEQ $r0, $r0            //如果r0=r0,则自陷

NOP                   //空操作指令

# 数据

.data        //随后定义的数据被存放到数据段

.align 2      // 将下一个数据对准字边界

DATA:

.word 128   //在连续的内存区中存储值为 wl,w2, …, 的 128 个字(32

位)的数

BUFFER:

.word 300   //在连续的内存区中存储值为 wl,w2, …, 的300个字(32

位)的数

pipeline

.text

main:

ADDIU $r8,$r0,num    //将r0和立即数num相加存入r8。32位按无符号数操作

LW $r1, 0($r8)        //取r8寄存器中的字加上16位偏移量存到r1寄存器中

      

BGEZAL $r1,func    //如果r1大于等于0,则执行func,并将返回地址(当前的 PC 值)保存到 R31

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

SW $r2, 60($r0)     //从r2中读取数据按16位偏移量offset 写入寄存器r0

TEQ $r0,$r0        //如果r0=r0,则自陷

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

func:

ADD $r2,$r1,$r0    //寄存器r1加r0,并将其存入r2

ADDI $r6,$r0,8     //寄存器r0加立即数8,并将其存入r6

loop:

ADDI $r1,$r1,-1     //寄存器r1加立即数-1,并将其存入r1

ADDI $r3,$r0,25     //寄存器r0加立即数25,并将其存入r3

LW  $r4, 60($r6)    //取r6寄存器中的字加上16位偏移量存到r4寄存器中

BEQ $r1,$r0,ret     //若寄存器r1和寄存器r0的值相等,则执行ret跳转指令

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

MUL $r2,$r1,$r2      //寄存器r1乘r2,并将其存入r2

BEQ $r0,$r0,loop     //若寄存器r0和寄存器r0的值相等,则执行loop循环指令

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

ret:

JR $r31            //寄存器r31跳转到PC

SLL $r0,$r0,0       //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

.data

num: .word 5      //在连续的内存区中存储值为 w0, …,w5 的 5个字(32 位)的数

schedule

.text

main:

ADDIU  $r1,$r0,A    //将r0和立即数A相加存入r1。32位按无符号数操作

LW     $r2,0($r1)    //取r1寄存器中的字加上16位偏移量存到r2寄存器中

ADD    $r4,$r0,$r2         //寄存器r2加r0,并将其存入r4

SW     $r4,0($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r4

LW     $r6,4($r1)          //取r1寄存器中的字加上16位偏移量存到r6寄存器中

ADD    $r8,$r6,$r1         //寄存器r1加r6,并将其存入r8

MUL    $r12,$r10,$r1          //寄存器r10乘r1,并将其存入r12

ADD    $r16,$r12,$r1          //寄存器r1加r12,并将其存入r16

ADD    $r18,$r16,$r1          //寄存器r1加r16,并将其存入r18

SW     $r18,16($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r18

LW     $r20,8($r1)           //取r1寄存器中的字加上16位偏移量存到r20寄存器中

MUL    $r22,$r20,$r14       //寄存器r14乘r20,并将其存入r22

MUL    $r24,$r26,$r14       //寄存器r14乘r26,并将其存入r24

TEQ $r0,$r0                 //如果r0=r0,则自陷

.data                       //随后定义的数据被存放到数据段

A:

.word 4,6,8                  //在连续的内存区中存储值为 w4 …,w8 的 8 个字(32 位)的数

afer-schedule

.text

main:

ADDIU  $r1,$r0,A            //将r0和立即数A相加存入r1。32位按无符号数操作

ADD    $r4,$r0,$r2          //寄存器r0加r2,并将其存入r4

LW     $r2,0($r1)           //取r1寄存器中的字加上16位偏移量存到r2寄存器中

SW     $r4,0($r1)           //从r1中读取数据按16位偏移量offset 写入寄存器r4

LW     $r6,4($r1)           //取r1寄存器中的字加上16位偏移量存到r6寄存器中

MUL    $r12,$r10,$r1       //寄存器r1乘r10,并将其存入r12

ADD    $r8,$r6,$r1          //寄存器r1加r6,并将其存入r8

ADD    $r16,$r12,$r1        //寄存器r1加r12,并将其存入r16

LW     $r20,8($r1)          //取r1寄存器中的字加上16位偏移量存到r20寄存器中

ADD    $r18,$r16,$r1        //寄存器r1加r16,并将其存入r18

SW     $r18,16($r1)          //从r1中读取数据按16位偏移量offset 写入寄存器r18

MUL    $r22,$r20,$r14        //寄存器r20乘r14,并将其存入r22

MUL    $r24,$r26,$r14        //寄存器r14乘r26,并将其存入r24

TEQ $r0,$r0                  //如果r0=r0,则自陷

.data

A:

.word 4,6,8                  //在连续的内存区中存储值为 w4, …,w8 的 8 个字(32 位)的数

Branch

.text

main:

ADDI  $r2,$r0,1024        //寄存器r0加立即数1024,并将其存入r2

ADD   $r3,$r0,$r0         //寄存器r3加r0,并将其存入r2

ADDI  $r4,$r0,8           //寄存器r0加立即数8,并将其存入r4

loop: 

LW    $r1,0($r2)           //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADDI  $r1,$r1,1           //寄存器r1加立即数1,并将其存入r1

SW    $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

ADDI  $r3,$r3,4           //寄存器r3加立即数4,并将其存入r3

SUB   $r5,$r4,$r3         //寄存器r3减r4,并将其存入r5

BGTZ  $r5,loop           //若r5大于0,则执行loop

ADD   $r7,$r0,$r6         //寄存器r6加r0,并将其存入r7

TEQ   $r0,$r0            //如果r0=r0,则自陷

delayed-branch

.text

main:

ADDI  $r2,$r0,1024         //寄存器r0加立即数1024,并将其存入r2

ADD   $r3,$r0,$r0          //寄存器r3加r0,并将其存入r0

ADDI  $r4,$r0,8            //寄存器r0加立即数8,并将其存入r4

loop: 

LW    $r1,0($r2)           //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADDI  $r3,$r3,4           //寄存器r3加立即数4,并将其存入r3

ADDI  $r1,$r1,1           //寄存器r1加立即数1,并将其存入r1

SUB   $r5,$r4,$r3         //寄存器r4减r3,并将其存入r5

SW    $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

BGTZ  $r5,loop           //若r5大于0,则执行loop

ADD   $r7,$r0,$r6         //寄存器r6加r0,并将其存入r7

TEQ   $r0,$r0            //如果r0=r0,则自陷

data_hz

.text

main:

ADDIU $r2,$r0,A       //将r0和立即数A相加存入r2。32位按无符号数操作

ADDIU $r3,$r0,B       //将r0和立即数B相加存入r3。32位按无符号数操作

loop:

LW $r1,0($r2)          //取r2寄存器中的字加上16位偏移量存到r1寄存器中

ADD $r1,$r1,$r3        //寄存器r3加r1,并将其存入r1

SW $r1,0($r2)          //从r2中读取数据按16位偏移量offset 写入寄存器r1

LW $r5,0($r1)          //取r1寄存器中的字加上16位偏移量存到r5寄存器中

ADDI $r5,$r5,10        //寄存器r5加立即数10,并将其存入r5

ADDI $r2,$r2,4         //寄存器r2加立即数4,并将其存入r2

SUB $r4,$r3,$r2        //寄存器r3减r2,并将其存入r4

BGTZ $r4,loop         //若r4大于0,则执行loop

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

TEQ $r0,$r0           //如果r0=r0,则自陷

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

SLL $r0,$r0,0          //r0中的低 32位进行逻辑左移,结果按符号位扩展,然后放人r0。 移动的位数为0

.data

A: .word 0, 4, 8                  //在连续的内存区中存储值为 w0,w1, …w4 的 8 个字(32 位)的数

B: .word 2, 1, 0                  //在连续的内存区中存储值为 w2,w1的 0个字(32 位)的数

structure_hz

.text

main:

ADD.D $f2,$f0,$f1         //双精度浮点f0加f1,并将其存入f2

ADD.D $f3,$f0,$f1         //双精度浮点f0加f1,并将其存入f3

ADD.D $f4,$f0,$f1         //双精度浮点f0加f1,并将其存入f4

ADD.D $f5,$f0,$f1         //双精度浮点f0加f1,并将其存入f5

ADD.D $f6,$f0,$f1         //双精度浮点f0加f1,并将其存入f6

ADD.D $f7,$f0,$f1         //双精度浮点f0加f1,并将其存入f7

ADD.D $f8,$f0,$f1         //双精度浮点f0加f1,并将其存入f8

ADD.D $f9,$f0,$f1         //双精度浮点f0加f1,并将其存入f9

TEQ $r0,$r0              //如果r0=r0,则自陷

  • 实验分析:

  

五、实验总结:

通过这次实验我知道了load和store指令的具体例子。LW是装入字,SW是保存字,ALU指令,都是寄存器-寄存器型(RR 型)或立即数型的。DADDU是无符号加,DADDIU是无符号立即加。控制指令的跳转和分支指令。JR是寄存器跳转,BEQZ是等于零时分支。算术运算指令:寄存器加(ADD),立即值加 (ADDI),无符号立即值加(ADDIU),寄存器乘(MUL)。逻辑运算指令与(AND)。CPU 移位指令:按立即值逻辑左移(SLL),分支指令:相等转移BEQ,大于0转移(BGTZ)。跳转指令:寄存器跳转(JR)。自陷指令:等于自陷(TEQ)等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_51303987

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值