- 实验要求
通过在 MARS 模拟器上运行和调试汇编程序,掌握 MIPS 指令系统计算机运行原理。
- 熟悉并掌握MARS软件
- 编写并执行MIPS程序
- 了解 MIPS 对过程调用的支持,掌握指令的寻址方式
- 实验结果与分析
- 熟悉并站务MARS软件
图表 1运行完成截图
-
- 程序代码中“.data”“.word”“.text”关键字的含义
图表 2MARS软件help中指令描述
“.data”表示以下是初始化数据段,变量声明后,即在主存中分配空间。
图表 3MARS软件help中指令描述
“.text”表示接下来是代码段,即各项指令操作,程序入口为“main”。
图表 4MARS软件help中指令描述
“.word”定义一个字,并为它分配空间,用于数据声明。例如,“var1: .word 3”声明一个 word 类型的变量 var1 , 同时给其赋值为 3 。
-
- MARS程序中的断点
在Execute界面左侧Bkpt 属性下可勾选以添加断点,在程序15 行添加断点并运行,如下图所示。
图表 5程序添加断点后运行截图
-
- 再次点击运行即可继续执行后续代码
图表 6继续执行后续代码
-
- 寄存器内容查看与修改
图表 7在界面右端可查看与修改寄存器内容
-
- 变量n 保存位置,计算第13 个Fibonacci 数
变量n 保存位置为$t5 ,由程序可知,$t5 从变量size 的地址访问了size 值。
图表 8把n 设置为13 后寄存器数值截图
图表 9运行结束后输出13个Fibonacci 数
-
- 代码中syscall 指令的作用
图表 10syscall (1)
此处syscall 的位置在输出运算结果之后,作用是声明程序结束。
图表 11syscall (2)
此处位于print 函数的末尾,作用是通过系统调用实现终端输出字符串head
图表 12syscall (3)和syscall (4)
这两处的syscall 用于循环输出Fibonacci 数列,第一个syscall 通过系统调用实现终端输出Fibonacci 数,之后一个syscall 实现终端输出空格分隔每个Fibonacci 数,最终实现如图表1 (或9 )的结果输出。
-
- 编写并执行 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程序运行结束(寄存器内容)截图
-
- 了解MIPS对过程调用的支持,掌握指令的寻址方式
图表 14运行结果截图
-
-
-
-
-
- 每行汇编指令添加注释,解释其在求解阶乘中的作用
-
-
-
-
如下图所示
图表 15源代码及注释
-
-
-
-
-
- 给出第一次运行到第 25 行代码时,栈顶位置和栈内存储的内容,并对每项内容给出解释
-
-
-
-
图表 16第一次运行到25行代码时栈顶位置和栈内存储的内容
其中栈顶位置在2147479524,指向数值1 ,在此位置的原因是最后一次跳转到fact时栈顶阶乘乘数为0,判断后进行了出栈操作。栈内存储内容分别为在第三次跳转并链接到fact时入栈的阶乘乘数1 ,第25行指令地址4194384,第二次跳转并链接到fact时入栈的阶乘乘数2 ,第25行指令地址4194384,第一次跳转并链接到fact时入栈的阶乘乘数3 ,第9行指令地址4194324。
-
-
-
-
-
- 在第 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程序要比直接用高级语言编写更加困难。经过本次实验,拓宽了我对计算机知识的认知,我觉得计算机理所应当的具备功能,却很难知晓相应的汇编指令是什么。我想学习汇编语言的作用就是让我知其然所以然,能够更加透彻地认知信息世界。