计算机组成原理实验2 MIPS 指令系统

  • 实验要求

通过在 MARS 模拟器上运行和调试汇编程序,掌握 MIPS 指令系统计算机运行原理。

  1. 熟悉并掌握MARS软件
  2. 编写并执行MIPS程序
  3. 了解 MIPS 对过程调用的支持,掌握指令的寻址方式

  • 实验结果与分析
    1. 熟悉并站务MARS软件

 

图表 1运行完成截图

    1. 程序代码中“.data”“.word”“.text”关键字的含义

 

图表 2MARS软件help中指令描述

“.data”表示以下是初始化数据段,变量声明后,即在主存中分配空间。

 

图表 3MARS软件help中指令描述

“.text”表示接下来是代码段,即各项指令操作,程序入口为“main”。

 

图表 4MARS软件help中指令描述

“.word”定义一个字,并为它分配空间,用于数据声明。例如,“var1:       .word     3”声明一个 word  类型的变量 var1 , 同时给其赋值为 3 。

    1. MARS程序中的断点

在Execute界面左侧Bkpt 属性下可勾选以添加断点,在程序15 行添加断点并运行,如下图所示。

 

图表 5程序添加断点后运行截图

    1. 再次点击运行即可继续执行后续代码

 

图表 6继续执行后续代码

    1. 寄存器内容查看与修改

 

图表 7在界面右端可查看与修改寄存器内容

    1. 变量n 保存位置,计算第13 个Fibonacci

变量n 保存位置为$t5 ,由程序可知,$t5 从变量size 的地址访问了size 值。

 

图表 8把n 设置为13 后寄存器数值截图

图表 9运行结束后输出13个Fibonacci

 

    1. 代码中syscall 指令的作用

 

图表 10syscall (1)

      此处syscall 的位置在输出运算结果之后,作用是声明程序结束。

 

图表 11syscall (2)

      此处位于print 函数的末尾,作用是通过系统调用实现终端输出字符串head

 

图表 12syscall (3)和syscall (4)

      这两处的syscall 用于循环输出Fibonacci 数列,第一个syscall 通过系统调用实现终端输出Fibonacci 数,之后一个syscall 实现终端输出空格分隔每个Fibonacci 数,最终实现如图表1 (或9 )的结果输出。

    1. 编写并执行 MIPS 程序

代码如下

       .data

num1: .word 1

num2: .word 0

       .text

       la $s0, num1

       la $s1, num2

       lw $s0, 0($s0)

       lw $s1, 0($s1)

       move $t0, $s0

       move $t1, $s1

       xor $t2, $t1, $t0

       xor $t3, $t2, $t1

       xor $t4, $t3, $t2

       xor $t5, $t4, $t3

       xor $t6, $t5, $t4

       xor $t7, $t6, $t5

       move $a0, $t7

       li $v0, 1

       syscall

       li   $v0, 10

   syscall

 

图表 13程序运行结束(寄存器内容)截图

    1. 了解MIPS对过程调用的支持,掌握指令的寻址方式

 

图表 14运行结果截图

            1. 每行汇编指令添加注释,解释其在求解阶乘中的作用

如下图所示

 

图表 15源代码及注释

            1. 给出第一次运行到第 25 行代码时,栈顶位置和栈内存储的内容,并对每项内容给出解释

 

图表 16第一次运行到25行代码时栈顶位置和栈内存储的内容

其中栈顶位置在2147479524,指向数值1 ,在此位置的原因是最后一次跳转到fact时栈顶阶乘乘数为0,判断后进行了出栈操作。栈内存储内容分别为在第三次跳转并链接到fact时入栈的阶乘乘数1 ,第25行指令地址4194384,第二次跳转并链接到fact时入栈的阶乘乘数2 ,第25行指令地址4194384,第一次跳转并链接到fact时入栈的阶乘乘数3 ,第9行指令地址4194324。

            1. 在第 19 行代码第一次跳转时,给出该行代码对应的机器语言(即二进制代码);给出该机器语言中对应 L1 的立即数,并解释为什么是该立即数

 

图表 17第19行代码第一次跳转

机器语言:0x11000003,对应二进制代码0b 0001 0001 0000 0000 0000 0000 0000 0011

对应L1地址的立即数为0x00400048,因为beq指令为pc相对寻址方式,机器语言中跳转指令的相对位置为3条指令,且当前地址为0x00400038故对应L1地址的立即数为0x00400038+(1+3)*4 = 0x00400048。

  • 实验小结

MIPS指令直接对计算机硬件操作,在使用时需要考虑直接作用于寄存器的操作,编写一个MIPS程序要比直接用高级语言编写更加困难。经过本次实验,拓宽了我对计算机知识的认知,我觉得计算机理所应当的具备功能,却很难知晓相应的汇编指令是什么。我想学习汇编语言的作用就是让我知其然所以然,能够更加透彻地认知信息世界。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值