微机原理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
微机原理实验报告实验名称:MIPS汇编程序设计
院系:电信学院
班级:
姓名:
指导老师:
一、实验目的:
1.熟悉MIPS汇编程序开发环境,学习使用Qtstim工具。知道如何查看内存空间分配。
2. 了解C语言语句与汇编指令之间的关系。
3. 掌握MIPS汇编程序设计,掌握QTSPIM的调试技术。
4. 了解MIPS汇编语言与机器语言之间的对应关系。
5. 熟悉常见的MIPS汇编指令
6. 掌握程序的内存映像。
二、实验内容
1.用汇编程序实现以下伪代码:要求使用移位指令实现乘除法运算。Int main ()
{
Int K,Y;
Int Z[50];
Y=56;
For(k=0;k<50;K++) Z[k]=Y-16*(k/4+210);
}
三、程序设计及分析
1.C语言分析:
有两个变量是int型,一个数组型;还有一个循环执行过程。
2.汇编程序实现分析:
首先需要定义用户数据段,获得一个内存空间作为数组空间。
再选定几个寄存器作为K,Y以及输出,其中输出输出和Y可以合用一个寄存器。
3.设计思路:
分配完空间地址后,最重要的是完成循环控制。循环控制有两个思路:可以是先判断后循环;或者是先循环后判断 即如图
slti $t2,$t0,50 #判断k 是否于50
beq $t2,$t3($t2=1循环,否则结束。)
四、程序实现及调试分析
1.汇编程序代码实现:
方法一
.data #定义用户数据段
z:.space 200 #数组为int型,大小为50,所以占内存4*50 str:.asciiz " "#输出结果之间的空隙
.text
main:
la $s0,z #$s0 #为数组在z[]
li $t0,0 #$s1 #代表k计数,初始值为0
li $t1,56 #$t2 #代表Y,初值为56
loop:
slti $t2,$t0,50 #判断k是否于50
beq $t2,$0,done #当k大于等于50,跳转结束
srl $t3,$t0,2 #k/4
addi $t3,$t3,210 #k/4+210
sll $t3,$t3,4 #16*(k/4+210)
sub $t3,$t1,$t3 #y-16*(k/4+210)
sw $t3,0($s0) #写进z[k]
li $v0,1 #输出
addi $a0,$s0,0
syscall
li $v0,4 #输出间隔
la $a0,str
syscall
addi $s0,$s0,4 #地址移一位
addi $t0,$t0,1 #k加1
j loop #循环
done:
li $v0,10
syscall
2.调试过程
1.编写程序:详细见代码
2.装载程序
选择file,选择Reinitialize and Load File,把写好的文件导入QtSpim。
3.如果没有错误,便运行。点击上图的小三角
运行之后点击不同的窗口便可得到我们想要的结果。具体详细结果如下图
内存占用情况映像
分析:由图可知数组地址从0Xfffff318—0Xfffff258;每行有四个是一样的,总共50个地址。这是因为数组含有50个元素,而int型数据占4个字节空间,字对齐方式,所以连续四个地址是相同的
而且有上表也可以得出Qpstim仿真器是按大字节序
数据段内存映像
表格如下(数值都采用16进制)
点击Window选择console得下图运行结果显示
代码段内存映像
地址机器码汇编指令[00400014] 0c100009 jal 0x00400024 [main] [00400018] 00000000 nop
[0040001c] 3402000a ori $2, $0, 10 [00400020] 0000000c syscall
[00400024] 3c101001 lui $16, 4097 [z] [00400028] 34080000 ori $8, $0, 0
[0040002c] 34090038 ori $9, $0, 56
[00400030] 290a0032 slti $10, $8, 50 [00400034] 11400010 beq $10, $0, 64 [done-0x00400034] [00400038] 00085882 srl $11, $8, 2
[0040003c] 216b00d2 addi $11, $11, 210 [00400040] 000b5900 sll $11, $11, 4
[00400044] 012b5822 sub $11, $9, $11 [00400048] ae0b0000 sw $11, 0($16) [0040004c] 34020001 ori $2, $0, 1 [00400050] 22040000 addi $4, $16, 0 [00400054] 0000000c syscall [00400058] 34020004 ori $2, $0, 4
地址机器码汇编指令[0040005c] 3c011001 lui $1, 4097 [str] [00400060] 342400c8 ori $4, $1, 200 [str] [00400064] 0000000c syscall [00400068] 22100004 addi $16, $16, 4 [0040006c] 21080001 addi $8, $8, 1 [00400070] 0810000c j 0x00400030 [loop] [00400074] 3402000a ori $2, $0, 10 [00400078] 0000000c syscall [80000180] 0001d821 addu $27, $0, $1 [80000184] 3c019000 lui $1, -28672 [80000188] ac220200 sw $2, 512($1) [8000018c] 3c019000 lui $1, -28672 [80000190] ac240204 sw $4, 516($1) [80000194] 401a6800 mfc0 $26, $13 [80000198] 001a2082 srl $4, $26, 2