微机原理实验报告十一月整理
时间:2020-11-24 10:03:25 来源:工作范文网 本文已影响 人
PAGE
PAGE 1
微机原理实验报告
实验名称:MIPS汇编程序设计
院系:电信学院
班级:
姓名:
指导老师:
实验目的:
1.熟悉MIPS汇编程序开发环境,学习使用Qtstim工具。知道如何查看内存空间分配。
2.了解C语言语句与汇编指令之间的关系。
3.掌握MIPS汇编程序设计,掌握QTSPIM的调试技术。
4.了解MIPS汇编语言与机器语言之间的对应关系。
5.熟悉常见的MIPS汇编指令6.掌握程序的内存映像。
二、实验内容
1.用汇编程序实现以下伪代码:要求使用移位指令实现乘除法运算。
Intmain()
{
IntK,Y;
IntZ[50];
Y=56;
For(k=0;k<50;K++)Z[k]=Y-16*(k/4+210);
}
三、程序设计及分析
1.C语言分析:
有两个变量是int型,一个数组型;还有一个循环执行过程。
2.汇编程序实现分析:
首先需要定义用户数据段,获得一个内存空间作为数组空间。再选定几个寄存器作为K,Y以及输出,其中输出输出和Y可以合用一个寄存器。
3.设计思路:
分配完空间地址后,最重要的是完成循环控制。循环控制有两个思路:可以是先判断后循环;或者是先循环后判断
即如图
开始开始
开始
开始
赋值int K, Y ;int Z[50] ;K=0;
赋值
int K, Y ;int Z[50] ;K=0;Y = 56;
赋值
赋值
int K, Y ;int Z[50] ;K=0;Y = 56;
计算Z[K] = Y - 16 * ( K / 4 + 210) ;
计算
Z[K] = Y - 16 * ( K / 4 + 210) ;
K<50
K<50
计算Z[K] = Y - 16 * ( K / 4 + 210) ;K=
计算
Z[K] = Y - 16 * ( K / 4 + 210) ;
K=k+1
K<50
K<50
K=k+1结束
K=k+1
结束
是
slti $t2,$t0,50 #判断
slti $t2,$t0,50 #判断k是否小于50,
beq $t2,$0,#是则结束
#否,循环
结束
slti$t2,$t0,50#判断k是否于50
beq$t2,$t3($t2=1循环,否则结束。)
四、程序实现及调试分析
汇编程序代码实现:
方法一
.data#定义用户数据段
z:.space200#数组为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
jloop#循环
done:
li$v0,10
syscall
2.调试过程
编写程序:详细见代码
装载程序
选择file,选择ReinitializeandLoadFile,把写好的文件导入QtSpim。
如果没有错误,便运行。点击上图的小三角
运行之后点击不同的窗口便可得到我们想要的结果。具体详细结果如下图
内存占用情况映像
分析:由图可知数组地址从0Xfffff318—0Xfffff258;每行有四个是一样的,总共50个地址。这是因为数组含有50个元素,而int型数据占4个字节空间,字对齐方式,所以连续四个地址是相同的
而且有上表也可以得出Qpstim仿真器是按大字节序
数据段内存映像
表格如下(数值都采用16进制)
内存地址(16进制)
变量名
值
内存地址(16进制)
变量名
值
fffff318
Z[0]
268500992
fffff2b8
Z[25]
268501092
fffff318
Z[1]
268500996
fffff2b8
Z[26]
268501096
fffff318
Z[2]
268501000
fffff2b8
Z[27]
268501100
fffff318
Z[3]
268501004
fffff2a8
Z[28]
268501104
fffff308
Z[4]
268501008
fffff2a8
Z[29]
268501108
fffff308
Z[5]
268501012
fffff2a8
Z[30]
268501112
fffff308
Z[6]
268501016
fffff2a8
Z[31]
268501116
fffff308
Z[7]
268501020
fffff298
Z[32]
268501120
fffff2f8
Z[8]
268501024
fffff298
Z[33]
268501124
fffff2f8
Z[9]
268501028
fffff298
Z[34]
268501128
fffff2f8
Z[10]
268501032
fffff298
Z[35]
268501132
fffff2f8
Z[11]
268501036
fffff288
Z[36]
268501136
fffff2e8
Z[12]
268501040
fffff288
Z[37]
268501140
fffff2e8
Z[13]
268501044
fffff288
Z[38]
268501144
fffff2e8
Z[14]
268501048
fffff288
Z[39]
268501148
fffff2e8
Z[15]
268501052
fffff278
Z[40]
268501152
fffff2d8
Z[16]
268501056
fffff278
Z[41]
268501156
fffff2d8
Z[17]
268501060
fffff278
Z[42]
268501160
fffff2d8
Z[18]
268501064
fffff278
Z[43]
268501164
fffff2d8
Z[19]
268501068
fffff268
Z[44]
268501168
fffff2c8
Z[20]
268501072
fffff268
Z[45]
268501172
fffff2c8
Z[21]
268501076
fffff268
Z[46]
268501176
fffff2c8
Z[22]
268501080
fffff268
Z[47]
268501180
fffff2c8
Z[23]
268501084
fffff258
Z[48]
268501184
fffff2b8
Z[24]
268501088
fffff258
Z[49]
268501188
点击Window选择console得下图
运行结果显示
代码段内存映像
地址机器码汇编指令
0c100009jal0main]
00000000nop
[0040001c]3402000aori$2,$0,10
0000000csyscall
3c101001lui$16,4097[z]
34080000ori$8,$0,0
[0040002cri$9,$0,56
290a0032slti$10,$8,50
11400010beq$10,$0,64[done-0
00085882srl$11,$8,2
[0040003c]216b00d2addi$11,$11,210
000b5900sll$11,$11,4
012b5822sub$11,$9,$11
ae0b0000sw$11,0($16)
[0040004cri$2,$0,1
22040000addi$4,$16,0
0000000csyscall
34020004ori$2,$0,4
地址机器码汇编指令
[0040005c]3c011001lui$1,4097[str]
342400c8ori$4,$1,200[str]
0000000csyscall
22100004addi$16,$16,4
[0040006cddi$8,$8,1
0810000cj0loop]
3402000aori$2,$0,10
0000000csyscall
0001d821addu$27,$0,$1
3c019000lui$1,-28672
ac220200sw$2,512($1)
[8000018c]3c019000lui$1,-28672
ac240204sw$4,516($1)
401a6800mfc0$26,$13
001a2082srl$4,$26,2
[8000019c]3084001fandi$4,$4,31
[800001a0ri$2,$0,4
[800001a4]3c049000lui$4,-28672[__m1_]
[800001a8]0000000csyscall
[800001acri$2,$0,1
[800001b0]001a2082srl$4,$26,2
[800001b4]3084001fandi$4,$4,31
[800001b8]0000000csyscall
[800001bcri$2,$0,4
[800001c0]3344003candi$4,$26,60
[800001c4]3c019000lui$1,-28672
[800001c8ddu$1,$1,$4
[800001cc]8c240180lw$4,384($1)
[800001d0op
[800001d4]0000000csyscall
[800001d8ri$1,$0,24
[800001dc]143a0008bne$1,$26,32[ok_pc-0x800001dc]
[800001e0op
[800001e4fc0$4,$14
[800001e8ndi$4,$4,3
[800001eceq$0,$4,16[ok_pc-0x800001ec]
[800001f0op
[800001f4]3402000aori$2,$0,10
[800001f8]0000000csyscall
[800001fcri$2,$0,4
3c019000lui$1,-28672[__m2_]
地址机器码汇编指令
3424000dori$4,$1,13[__m2_]
0000000csyscall
[8000020c]001a2082srl$4,$26,2
3084001fandi$4,$4,31
14040002bne$0,$4,8[ret-0
00000000nop
[8000021c]401a7000mfc0$26,$14
275a0004addiu$26,$26,4
409a7000mtc0$26,$14
3c019000lui$1,-28672
[8000022c]8c220200lw$2,512($1)
3c019000lui$1,-28672
8c240204lw$4,516($1)
001b0821addu$1,$0,$27
[8000023ctc0$0,$13
401a6000mfc0$26,$12
375a0001ori$26,$26,1
409a6000mtc0$26,$12
[8000024cret
仿真器在真正的用户代码段内增加了部分代码以实现程序运行控制,用户代码都必须存储在地址为00范围之内。用户代码段将每一行代码的地址,及其对应的机器码都显示给用户,为方便查看,还给出了反汇编得到的汇编指令,而且在注释中显示了用户编写的源代码。通过地址部分信息,我们知道每一行代码的地址都是前一行代码地址+4,即PC+4,机器指令。
实验总结
本次试验让我对汇编程序的编写以及原理有力深刻的了解。还有语法规范。书写技巧,如何对书写的程序一目了然,层次清晰,还有养成多写注释习惯,既清晰自己的思路,还有助于别人的阅读。
由于汇编与C语言有较大的差别,所以刚开始编写非常不适应,编写程序不熟练,后面就好了一些。首先要全局观,对各个寄存器所代表的意义要清晰;还要对程序执行过程了如指掌,尤其是跳转部分,跳转条件,是相等跳转,还是不相等跳转,是先循环在判断还是先循环后判断。
基本掌握了Qtspim软件的应用和程序的调试工作,并更深刻地理解了汇编语言中机器指令的执行方法。对各个窗口以及一些常用的菜单各个数据段的含义做到了一一熟悉了解。还有基本掌握了内存的分配区间。
还有最重要的是多练习。虽然基本上现在的这些程序都能做到看懂,但是一遇到让自己写的时候还是有许多艰难的,熟能生巧嘛。
- 下载文档
- 收藏
- 0